Domanda

Ho cercato ciao e basso e mi sono bloccato qui.

Sto usando EF 4.1 in un app MVC3, con il modello di servizio / Repository / UnitOfWork e automapper per mappare i miei modelli ed entità.

Ho una situazione veramente di base; Ho una collezione di ChildProducts che hanno una raccolta di PriceTiers.

I miei modelli vista simile a questa:

AddEditChildProductModel

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
    }

AddEditPriceTierModel

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
    }

Nel azione di controllo, sto semplicemente cercando di mappare le proprietà mutato PriceTier:

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);
        }

E sto ottenendo questo errore:

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.

Quando entrare in azione, i modelli / entità vengono mappati in modo corretto, io non capisco !!

È stato utile?

Soluzione

Eranga è giusto. Sto indovinando il tuo productService non chiama AsNoTracking sul contesto ef prima di restituire il ChildProduct. In caso contrario, questo significa quello che restituisce è ancora collegata al contesto. Quando automapper fa la sua cosa, che sostituisce l'intera collezione, che può orfano le entità figlio allegati che non facevano parte della presentazione modulo. Dal momento che gli orfani non hanno una chiave esterna non nullo, devono essere eliminati dal contesto prima di chiamare SaveChanges. Se non lo sono, si ottiene questa eccezione infame.

D'altra parte, se il productService chiama AsNoTracking sul contesto prima di tornare l'entità, non sarà traccia delle modifiche, e non cercherà di eliminare tutti gli elementi orfani che non esistono nella collezione creata da automapper.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top