Entity Framework не отслеживает изменения коллекции при повторном подключении объекта - PullRequest
7 голосов
/ 31 января 2012

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

Так что в основном это означает, что мои объекты потребляются в отключенном режиме.Эти объекты могут быть созданы, просмотрены, обновлены и удалены.У меня не было проблем с сохранением изменений обратно в базу данных, используя отключенный режим.Но я обнаружил конкретный случай, когда изменения не сохраняются без ошибок при вызове метода 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 просто не может отслеживать изменения такого рода при повторном присоединении объекта?

1 Ответ

8 голосов
/ 31 января 2012

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

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

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

...