Find
работает правильно, потому что EF никогда не загружает связанные сущности самостоятельно.Чтобы загрузить связанные свойства, вы должны использовать либо нетерпеливую, либо ленивую загрузку.Третий вариант иногда называют явной загрузкой.
Ленивая загрузка обеспечит вам автоматическую загрузку связанных сущностей, но сгенерирует дополнительные запросы к базе данных.Связанная сущность или связанная коллекция будут загружены при первом обращении к свойству.Чтобы использовать отложенную загрузку, вы должны пометить все свойства навигации в сущности как virtual
(@ckal предоставил вам пример).Кроме того, отложенная загрузка работает, только если контекст, используемый для загрузки основного объекта, все еще активен.
Стремительная загрузка определит, какое отношение должно быть загружено вместе с вашим основным объектом.Стремительная загрузка выполняется методом Include
.Вы можете переписать Find
как:
Course c = _unitOfWork.DbContext
.Set<Course>()
.Include(c => c.Students)
.Include(c => c.Teacher)
.SingleOrDefault(c => c.CourseId == keyValue);
Явная загрузка позволит вам явно сказать, что какое-то отношение должно быть загружено.Вы даже можете определить некоторые условия для загрузки связанных сущностей, что невозможно с двумя другими методами.Сначала вы должны загрузить основную сущность, а перед удалением контекста вы можете сделать что-то вроде:
context.Entry(course).Collection(c => c.Students).Load();