Проблема ChangeTracker в DbContext - PullRequest
       4

Проблема ChangeTracker в DbContext

0 голосов
/ 27 апреля 2011

У меня есть программа на CodeFirst EF-4.1. Пользователь получает контекст и может изменять некоторые свойства. Когда пользователь закончил, я делаю быстрый

ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);

, чтобы определить, требуется ли SaveChanges() или нет. Если я выполняю вызов SaveChanges (), внесенные изменения сохраняются в базе данных.

Это работает для некоторых свойств и не работает для других. В частности, кажется, что он работает с простыми типами (float s) и с иерархиями коллекций (ObservableCollection s).

Я что-то не так делаю?

1 Ответ

5 голосов
/ 28 апреля 2011

Да, это проблема.Некоторые отношения не отслеживаются DbChangeTracker.Существует разница между Независимой ассоциацией и Ассоциацией внешнего ключа .Изменения в отношении отслеживаются в случае:

  • Отношение «один к одному», которое всегда является ассоциацией внешнего ключа в EFv4 +
  • Отношение «один ко многим» с ассоциацией внешнего ключа - выдолжен установить свойство внешнего ключа

Изменения в отношении не отслеживаются в случае:

  • Отношение один-ко-многим с Независимой ассоциацией
  • Многиеотношение ко многим, которое всегда является независимой ассоциацией

Не отслеживается для независимой ассоциации, неправильное присвоение имен.Эти изменения отслеживаются, но DbChangeTracker не предоставляет доступ к этим изменениям !Вы должны преобразовать DbContext в ObjectContext и использовать ObjectStateManager, чтобы получить доступ к ObjectStateEntries, представляющему независимые ассоциации.

В этом случае проще всего просто всегда вызывать SaveChanges.Он не будет выполнять никаких команд БД, если не нужно сохранять данные.

...