EF DbContext не будет загружать что-либо из базы данных автоматически, даже если включена отложенная загрузка. Когда вы связываете объект с DbContext, добавляя его или присоединяя его, DbContext будет проходить через свойства виртуальной навигации, чтобы связать любые ссылки, о которых он знает.
Например: с учетом отношения «Родитель / ребенок», когда у одного родителя много детей и в базе данных уже есть запись «Родитель» с идентификатором ParentID, равным 10.
using (var context = new TestDbContext())
{
var child = new Child { Name = "test", ParentId = 10 };
context.Children.Add(child);
context.SaveChanges();
Assert.IsNull(child.Parent);
}
Родительский идентификатор будет установлен на 10, но Родительская ссылка будет нулевой. Контекст просто не знает об этом. Если вы позже загрузите этот родительский элемент, даже не связывая его с сущностью, presto, прокси вернет его. DbContext просматривает загруженные сущности для всего, что может ссылаться на загруженный родительский элемент, и связывает его. (Такое поведение, вероятно, объясняет замедление долгоживущих DbContexts.)
using (var context = new TestDbContext())
{
var child = new Child { Name = "test", ParentId = 10 };
context.Children.Add(child);
context.SaveChanges();
Assert.IsNull(child.Parent);
var parent = context.Parents.Find(10);
Assert.IsNotNull(child.Parent); // Poof, Parent is now a proxy pointing to the Parent.
}
Это может быть неловко, когда DbContexts являются относительно долгоживущими, поскольку его знание связанных сущностей может варьироваться в зависимости от того, что может или не могло быть загружено связанным кодом, что приводит к прерывистым исключениям NullReferenceExceptions и тому подобному.
Это одна из веских причин избегать использования свойств FK в сущностях, имеющих свойства навигации, вместо этого просто использовать свойство навигации с ключом, отображаемым за кулисами, или свойством shadow. (EF Core) Когда вы используете FK и свойства навигации, вы должны знать о некоторых потенциально странных действиях при получении информации из ссылок навигации после установки или изменения FK. Обычно безопаснее иметь дело со свойствами навигации.