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.