Что вызывает 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.