Вопрос

Я искал привет и низкий, и я застрял здесь.

Я использую EF 4.1 в приложении MVC3 с шаблоном службы/репозитория/единиц и автоматического автомата для картирования моих моделей и объектов.

Так что у меня действительно основная ситуация; У меня есть коллекция ChildProducts которые имеют коллекцию PriceTiers.

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

Добавлена

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
    }

AdditPricetierModel

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.

При вступлении в действие модели/сущности правильно отображаются, я не понимаю !!

Это было полезно?

Решение

Эранга прав. Я предполагаю, что ваш продукт Service не называет Asnotracking в контексте EF, прежде чем вернуть детскую продукцию. Если нет, это означает, что то, что он возвращает, все еще прикреплена к контексту. Когда Automapper делает свое дело, он заменяет всю коллекцию, которая может оцитировать прикрепленные дочерние объекты, которые не были частью подчинения формы. Поскольку сироты не имеют не нулевого иностранного ключа, они должны быть удалены из контекста, прежде чем вызовать Savechanges. Если это не так, вы получите это печально известное исключение.

С другой стороны, если ваш продукт Service вызовет Asnotracking в контексте, прежде чем вернуть сущность, он не будет отслеживать изменения и не будет пытаться удалить какие -либо осиротежные элементы, которые не существуют в коллекции, созданной Automapper.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top