Entity Framework не отслеживает изменения коллекции при повторном подключении сущности

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

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


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

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

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