Entity Framework - явная загрузка
Когда вы отключили ленивую загрузку, все еще можно лениво загружать связанные сущности, но это должно выполняться с явным вызовом.
В отличие от отложенной загрузки, нет двусмысленности или возможности путаницы относительно того, когда выполняется запрос.
Для этого вы используете метод Load для записи связанной сущности.
Для отношения «один ко многим» вызовите метод Load в Collection.
А для однозначной связи вызовите метод Load в ссылке.
Давайте посмотрим на следующий пример, в котором ленивая загрузка отключена, а затем извлекается ученик по имени Али.
Затем информация о студенте записывается на консоль. Если вы посмотрите на код, информация о регистрации также записана, но сущность Enrollments еще не загружена, поэтому цикл foreach не будет выполняться.
После этого сущность Enrollments загружается явно, теперь информация о студенте и информация о зачислении будут записаны в окне консоли.
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
context.Configuration.LazyLoadingEnabled = false;
var student = (from s in context.Students where s.FirstMidName ==
"Ali" select s).FirstOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0}, Course ID: {1}",
enrollment.EnrollmentID, enrollment.CourseID);
}
Console.WriteLine();
Console.WriteLine("Explicitly loaded Enrollments");
Console.WriteLine();
context.Entry(student).Collection(s ⇒ s.Enrollments).Load();
Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0}, Course ID: {1}",
enrollment.EnrollmentID, enrollment.CourseID);
}
Console.ReadKey();
}
}
}
Когда приведенный выше пример будет выполнен, вы получите следующий результат. Сначала отображается только информация о студенте, а после явной загрузки объекта enrollments отображается как студент, так и связанная с ним информация о зачислении.
ID: 1, Name: Ali Alexander
Explicitly loaded Enrollments
ID: 1, Name: Ali Alexander
Enrollment ID: 1, Course ID: 1050
Enrollment ID: 2, Course ID: 4022
Enrollment ID: 3, Course ID: 4041
Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.