Что вызывает Entity Framework для исправления свойства навигации?

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

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

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

1 ответ

Решение

Ты прав. DetectChanges это метод, который вызывает исправление отношений. Если вы хотите, чтобы по каким-либо причинам произошла смена отношений, позвоните DetectChanges,

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

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext.SaveChanges
  • DbSet.Attach
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries
  • Выполнение любого запроса LINQ для DbSet

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

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

При использовании сущностей отслеживания изменений одно из пары свойств навигации фиксируется, когда задана другая навигация. Например, предположим, что есть основная сущность навигации от публикации к блогу и есть свойство зависимой коллекции от блога к публикации. Если вы используете объекты отслеживания изменений, то установка post.Blog = blog также приведет к созданию blog.Posts.Add(post). Это может немного сбить с толку, если вы привыкли делать в своем коде и post.Blog = blog, и затем blog.Posts.Add(post) до SaveChanges. Когда вы используете DetectChanges, это безвредно, но при использовании сущностей отслеживания изменений вы получите две копии сообщения в коллекции blog.Posts до SaveChanges.

Другие вопросы по тегам