Pregunta

He buscado hola y bajo y estoy atrapado aquí.

Estoy usando EF 4.1 en una aplicación MVC3, con el servicio de servicio/repositorio/unidad de trabajo y automático para mapear mis modelos y entidades.

Así que tengo una situación realmente básica; Tengo una colección de ChildProducts que tienen una colección de PriceTiers.

Mis modelos de vista se ven así:

SUDDITCHILDPRODUCTMODEL

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
    }

SeñaditPricetiermoDel

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
    }

En la acción del controlador, simplemente estoy tratando de mapear el cambio PriceTier propiedades:

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

Y recibo este error:

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.

Al entrar en la acción, las modelos/entidades se asignan correctamente, ¡no lo entiendo!

¿Fue útil?

Solución

Eranga tiene razón. Supongo que su servicio de productos no llama a ASNOTRacking en el contexto EF antes de devolver el producto infantil. Si no, esto significa que lo que devuelve todavía está adjunto al contexto. Cuando Automapper hace lo suyo, reemplaza toda la colección, que puede huérfano de las entidades infantiles adjuntas que no formaban parte de la presentación del formulario. Dado que los huérfanos no tienen una clave extranjera no nula, deben eliminarse del contexto antes de llamar a SaveChanges. Si no lo son, obtienes esta infame excepción.

Por otro lado, si su servicio de productos llama a ASNOTRacking en el contexto antes de devolver la entidad, no rastreará los cambios y no intentará eliminar ningún elemento huérfano que no existan en la colección creada por Automapper.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top