2012-01-31 4 views
7

В последнее время я использовал много Entity Framework в приложении MVV MVVM, и я столкнулся с некоторыми проблемами. Для отображения данных мои модели просмотра используют короткий объект ObjectContext. Эти модели представлений будут использоваться в долговременном процессе, поэтому я предпочитаю использовать объект ObjectContext с коротким прожигом, чтобы не ухудшить производительность.Entity Framework не отслеживает изменения коллекции при повторном подключении объекта

Так что в основном это означает, что мои объекты потребляются в отключенном режиме. Эти полномочия могут быть созданы, просмотрены, обновлены и удалены. У меня не было проблем с сохранением изменений в базе данных в отключенном режиме. Но я нашел конкретный случай, когда изменения не сохраняются без ошибок при вызове метода SaveChanges(). Это происходит, когда я пытаюсь обновить объект, у которого есть свойство коллекции. Скалярное свойство объекта сохраняется без проблем, но изменения в коллекции не отражаются в базе данных, как если бы они не могли отслеживать эти изменения при повторном подключении.

Вот пример кода моего случая, когда я изменяю имя сущности, а затем добавляю объект в его коллекцию отчетов. После SaveChanges() в базе данных отражено только имя клиента.

this.Client.Name = "Test Client"; 
this.Client.Reports.Add(new Report { Name = "Test Report" }); 

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName)) 
{ 
    entities.Clients.ApplyCurrentValues(this.Client); 
    entities.SaveChanges(); 
} 

Я делаю что-то неправильно или EF просто не может отслеживать такие изменения при повторной привязке объекта?

ответ

8

То, что exactly what happens. Нет отслеживания изменений, и EF не знает об изменениях, выполненных в свойствах навигации. Также ApplyCurrentValues способен обрабатывать только скалярные и сложные свойства. Не навигационные свойства.

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

КПП. Я никогда не использовал MVVM, поэтому я не уверен, как это применимо в этом случае, но в случае MVP вы можете использовать длинный живой контекст, если он используется для одиночной операции - например, редактирование будет обрабатываться его собственным презентатором со своим собственным контекстом , Этот контекст будет работать до тех пор, пока представление будет использоваться для редактирования отдельного объекта/агрегата = он будет использоваться для загрузки объекта, и тот же контекст будет использоваться для сохранения объекта, поскольку в этом случае редактирование выполняется одним и тем же контекстом выполнения и принадлежит единая единица работы.

+0

Действительно интересный случай. Теперь факт, что EF не обновляет эти изменения, имеет смысл, поскольку объект навигационного свойства также может ссылаться на другой объект. Нет проблем при создании нового объекта, но проблемы с параллелизмом могут возникать при удалении. В моей архитектуре каждый MVVM представляет собой единственную репутацию парадигмы CRUD. Я переместил свою виртуальную машину на подключенный режим (процесс утилизации обрабатывается из коробки по моей архитектуре), а профилирование памяти пока не выявило каких-либо проблем. Время покажет, и на самом деле довольно легко вернуться в отключенный режим. Спасибо за вашу помощь. – Ucodia

Смежные вопросы