EF 4.1 - Обновление свойств дочерней коллекции - PullRequest
1 голос
/ 05 сентября 2011

Я искал hi и low и застрял здесь.

Я использую EF 4.1 в приложении MVC3, с шаблоном Service / Repository / UnitOfWork и AutoMapper для сопоставления моих моделей и сущностей.

Итак, у меня действительно базовая ситуация;У меня есть коллекция ChildProducts, которая имеет коллекцию PriceTiers.

Модели моего вида выглядят так:

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
    }

В действии контроллера я просто пытаюсь отобразить измененные свойства 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);
        }

И я получаю этоошибка:

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.

При входе в действие модели / объекты отображаются правильно, я не понимаю !!

1 Ответ

1 голос
/ 09 декабря 2011

Эранга прав. Я предполагаю, что ваш productService не вызывает AsNoTracking в контексте ef перед возвратом ChildProduct. Если нет, это означает, что то, что он возвращает, все еще привязано к контексту. Когда automapper делает свое дело, он заменяет всю коллекцию, которая может осиротеть присоединенные дочерние объекты, которые не были частью отправки формы. Поскольку у сирот нет ненулевого внешнего ключа, их необходимо удалить из контекста перед вызовом SaveChanges. Если нет, вы получите это печально известное исключение.

С другой стороны, если ваш productService вызывает AsNoTracking для контекста перед возвратом сущности, он не будет отслеживать изменения и не будет пытаться удалить любые потерянные элементы, которые не существуют в коллекции, созданной automapper.

...