2013-12-19 4 views
5

Я не смог найти хорошую документацию, точно так же, как Entity Framework решит найти правильный связанный объект, когда установлен внешний ключ.Что заставляет Entity Framework исправить свойство навигации?

Я использую ленивую загрузку (но не отслеживание изменений) прокси. Установка внешнего ключа, а затем получение значения свойства навигации возвращает значение null, даже если связанный навигационный объект уже загружен и находится в DbContext.

Вызов DetectChanges работает, но кажется тяжелым. Есть ли другой способ понять в Entity Framework, чтобы сделать исправление?

ответ

4

Вы правы. DetectChanges - метод, который инициирует фиксацию отношений. Если вы хотите, чтобы исправление отношения происходило по какой-либо причине, вы вызываете DetectChanges.

Но DetectChanges также называют самой EF при выполнении следующих методов:

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext .SaveChanges
  • DbSet.Attach
  • DbCon text.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries
  • Запуск любой запрос LINQ против DbSet

(Из книги Лерман & Миллера DbContext, с. 60).

Как вы видите, почти все, что вы сделаете с EF после установки значения внешнего ключа, вызовет DetectChanges, поэтому, если у вас есть другие полезные вещи, которые нужно сделать после этого, сделайте это сначала и сохраните один вызов DetectChanges.

+0

Так есть метод, который вызовы DetectChanges будут делать исправление без полного обнаружения изменений? – jnm2

+0

Нет, 'ObjectStateManager' имеет только закрытый метод' AlignChangesInRelationships', который вызывается в 'DetectChanges'. Но это самый эффективный способ сначала обнаружить изменения, а затем исправить отношения, на которые влияют эти изменения. Не все отношения. –

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