2017-01-25 1 views
3

Я создал сопоставление для сопоставления коллекции в ViewModel с другой коллекцией модели, которая, кажется, работает без проблем. После сопоставления дочерний объект модели имеет соответствующие обновления.Как обновить объект с вложенными объектами с помощью AutoMapper и сохранить обновленную структуру Entity с Entity Framework?

configuration.CreateMap<SourceViewModel, Destination>()     
      .ForMember(d => d.ChildOfDestination, 
         opt => opt.MapFrom(s => Mapper.Map<ICollection<SourceViewModel>, ICollection<Destination>>(s.ChildOfSource))); 

Однако при сохранении выдается ошибка:

Операция не удалась: Отношения не могут быть изменены, так как один или несколько внешних ключей свойств не является обнуляемым. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.

То, что я нашел, это ChangeTracker.Entries() имеет дополнительные элементы с состоянием «Добавлено». Например, у моего Model.ChildCollection есть счет 2, но в Entries() у меня есть исходные 2 элемента из ChildCollection с состояниями «Модифицировано» и 2 из тех же элементов с состояниями «Добавлено»

Я написал некоторый код, чтобы обойти проблему на данный момент, но это взломать большую проблему, и я не уверен, как ее решить.

foreach (var child in ViewModel.Child) 
{ 
    var record = Model.Child.SingleOrDefault(c => c.ID == child.ID); 

    if (record != null) 
     Mapper.Map(child, record); 
    else 
     Model.Child.Add(Mapper.Map<SourceViewModel, Destination>(child)); 
} 
+0

Помог ли мой ответ? – Seany84

ответ

1

Entity Framework 6

отсоединен данные старая проблема, которая предшествует Entity Framework и, по этому вопросу, большинство инструментов доступа к данным. Это никогда не было простым решением . Сервер отправляет данные по проводам, не зная, что может произойти с в клиентском приложении, которое запросило его, даже не зная, , если он вернется. Затем, неожиданно, некоторые данные снова появляются в запросе. Но это одни и те же данные? Каково это в его отсутствие? что-нибудь случилось с ним? Это совершенно новые данные? Столько, чтобы волноваться о!

Источник: https://msdn.microsoft.com/da-dk/magazine/mt694083

Очень хороший ответ на этом сайте со ссылкой на приведенную выше статью: https://stackoverflow.com/a/21436713/550198

Entity Framework ядро ​​/ Entity Framework 7

Entity Framework ядро ​​также известный как EF7 имеет новые функции, которые позволят вам пройти график объектов. например

context.ChangeTracker.TrackGraph(someEntity, e => e.Entry.State = EntityState.Added); 
Смежные вопросы