Entity Framework - jawne ładowanie
Po wyłączeniu ładowania z opóźnieniem nadal można leniwie ładować powiązane jednostki, ale należy to zrobić za pomocą jawnego wywołania.
W przeciwieństwie do ładowania z opóźnieniem, nie ma niejednoznaczności ani możliwości nieporozumień dotyczących czasu wykonywania zapytania.
Aby to zrobić, użyj metody Load na wpisie jednostki pokrewnej.
W przypadku relacji jeden do wielu wywołaj metodę Load w kolekcji.
W przypadku relacji jeden do jednego wywołaj metodę Load w odwołaniu.
Przyjrzyjmy się poniższemu przykładowi, w którym leniwe ładowanie jest wyłączone, a następnie pobierany jest uczeń o imieniu Ali.
Informacje o uczniach są następnie zapisywane na konsoli. Jeśli spojrzysz na kod, zapisywane są również informacje o rejestracji, ale encja Enrollments nie jest jeszcze załadowana, więc pętla foreach nie zostanie wykonana.
Po jawnym załadowaniu encji Enrollments informacje o studentach i zapisach zostaną zapisane w oknie konsoli.
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();
}
}
}
Po wykonaniu powyższego przykładu otrzymasz następujące dane wyjściowe. Najpierw wyświetlane są tylko informacje o uczniu, a po jawnym załadowaniu jednostki rejestracji wyświetlane są zarówno informacje o uczniu, jak i o powiązanych z nim zapisach.
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
Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.