Ответ 1
Причина объясняется в разделе " Загрузка связанных данных " документации EF Core.
Первое поведение заключается в том, что EF Core в настоящее время не поддерживает ленивую загрузку, поэтому обычно вы получите null
для свойств навигации, пока вы не загрузите их с помощью нетерминальной или явной загрузки. Однако раздел загрузки Eager содержит следующее:
Совет
Entity Framework Core автоматически исправляет свойства навигации для любых других объектов, которые ранее были загружены в экземпляр контекста. Поэтому, даже если вы явно не включаете данные для свойства навигации, свойство все равно может быть заполнено, если ранее были загружены некоторые или все связанные объекты.
что объясняет, почему свойство навигации не является нулевым во втором случае.
Теперь я не уверен, какое из двух типов поведения вы хотите исправить, поэтому попытайтесь решить оба вопроса.
Первое поведение может быть "исправлено" с использованием одного из доступных в настоящее время методов для загрузки связанных данных, например, с нетерпением загрузки:
var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();
Второе поведение "по дизайну" и не может контролироваться. Если вы хотите избежать этого, обязательно используйте новый экземпляр DbContext
только для выполнения одного запроса, чтобы повторить необходимые данные.
Обновление: начиная с версии 2.1, EF Core поддерживает Lazy Loading. Однако он не включен по умолчанию, поэтому для его использования нужно пометить все свойства навигации virtual
, установить Microsoft.EntityFrameworkCore.Proxies и включить его с помощью вызова UseLazyLoadingProxies
или использовать Lazy-загрузку без прокси-серверов - как объяснено примерами в EF Core документация.