Сохранение сложного графа отдельных объектов в EF6

detach entity-framework entity-framework-6 save

Вопрос

У меня есть текущий сценарий:

Сначала я использую EF6 Code и создал модель данных примерно так:

public class MainObject{
  ..some properties
  IList<SubObject> SubObjects{get;set;}
}

public class SubObject{
  ..some properties
  IList<SubSubObject> SubSubObjects{get;set;}
}

public class SubObject{
  ..some properties
  IList<SubObject> SubObjects{get;set;}
}

Таким образом, в основном у меня есть основной объект, который имеет от 0 до многих подобъектов, и между подобъектом и подсубъектами существует много-много отношений.

Я создаю приложение MVC, поэтому мой обычный поток программы заключается в том, что пользователь запрашивает страницу, которая в основном использует объект MainObject, как модель данных. Затем пользователь взаимодействует со страницей и изменяет, добавляет или удаляет подобъекты и подсубъекты по своему усмотрению, а затем нажимает на сохранение. При сохранении объект-граф отправляется обратно на контроллер и выглядит корректно в соответствии с изменениями, выполненными пользователем на стороне клиента. Теперь моя проблема заключается в следующем:

Как сохранить это обратно в базу данных в хорошем состоянии.

Мне нужно привязать свой объект обратно к контексту, но я не знаю, какие объекты новые, изменены или удалены.

Я написал некоторый код, который частично работает сейчас, но он становится настолько уродливым, что я действительно не хочу идти по этому пути. Можно ли каким-то образом получить соответствующий граф объектов из базы данных и сравнить EF два графика по отношению друг к другу, а затем сохранить соответствующие изменения в базе данных?

Любая помощь, чтобы сделать эту гладкость, будет очень благодарна.

Принятый ответ

Я закончил использовать GraphDiff, чтобы решить это для меня, и он отлично работает! Это действительно должно быть встроено в EF, но пока это не произойдет, это отличная замена.

Чтобы решить пример, приведенный в моем вопросе выше, это обеспечит правильное сохранение отдельного графика (учитывая, что у меня есть объект MainObject я хочу сохранить main):

context.UpdateGraph(main, map =>map
  .AssociatedCollection( m => m.SubObjects, with => with
    .AssociatedCollection( s => s.SubSubObjects)
  )
);

context.SaveChanges();


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему