Frage

Ich habe Hallo und Low gesucht und bin hier festgefahren.

Ich verwende EF 4.1 in einer MVC3 -App mit dem Service/Repository/Unitofwork und Automapper, um meine Modelle und Entitäten zuzuordnen.

Ich habe also eine wirklich grundlegende Situation; Ich habe eine Sammlung von ChildProducts die eine Sammlung von haben PriceTiers.

Meine Ansichtsmodelle sehen so aus:

HinzugefügtesProductModel hinzugefügt

public class AddEditChildProductModel
    {
        #region "Fields/Properties"
        public ActionType ActionType { get; set; }
        public string FormAction { get; set; }

        public int ID { get; set; }
        public int ProductID { get; set; }

        public string Sku { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public decimal Cost { get; set; }
        public decimal MSRP { get; set; }
        public decimal RetailPrice { get; set; }

        public int Servings { get; set; }
        public decimal Weight { get; set; }

        public bool Display { get; set; }
        public int DisplayIndex { get; set; }

        public IEnumerable<AddEditPriceTierModel> PriceTiers { get; set; }

        #endregion

        #region "Constructor(s)"

        #endregion

        #region "Methods"

        #endregion
    }

AddititPricetiermodel

public class AddEditPriceTierModel
    {
        #region "Fields/Properties"
        public int ID { get; set; }
        public int ChildProductID { get; set; }
        public decimal Price { get; set; }
        public int QuantityStart { get; set; }
        public int QuantityEnd { get; set; }
        public bool IsActive { get; set; }
        #endregion

        #region "Constructor(s)"

        #endregion

        #region "Methods"

        #endregion
    }

In der Controller -Aktion versuche ich einfach, die Veränderungen zu kartieren PriceTier Eigenschaften:

public ActionResult EditChildProduct(AddEditChildProductModel model)
        {
            if (!ModelState.IsValid)
                return PartialView("AddEditChildProduct", model);

            ChildProduct childProduct = productService.GetChildProductByID(model.ID);
            AutoMapper.Mapper.Map<AddEditChildProductModel, ChildProduct>(model, childProduct);
            UnitOfWork.Commit();

            return ListChildProducts(model.ProductID);
        }

Und ich bekomme diesen Fehler:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Wenn ich in die Aktion eintritt, werden die Modelle/Entitäten richtig zugeordnet, ich verstehe es nicht !!

War es hilfreich?

Lösung

Eranga hat recht. Ich vermute, Ihr ProductService nennt Asnotracking im EF -Kontext nicht, bevor er das Kinderprodukt zurückgibt. Wenn nicht, bedeutet dies, dass das, was es zurückgibt, immer noch mit dem Kontext verbunden ist. Wenn Automapper sein Ding tut, ersetzt es die gesamte Sammlung, die die angeschlossenen Kinderhersteller, die nicht Teil der Formulareingabe waren, verwandeln können. Da die Waisen keinen nicht null-fremden Schlüssel haben, müssen sie aus dem Kontext gelöscht werden, bevor sie Savechanges aufrufen. Wenn dies nicht der Fall ist, erhalten Sie diese berüchtigte Ausnahme.

Wenn Ihr ProductService vor der Rückgabe der Entität auf dem Kontext auf dem Kontext aufgerufen wird, wird Änderungen nicht verfolgt und versucht nicht, verwaiste Artikel zu löschen, die in der von Automapper erstellten Sammlung nicht vorhanden sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top