Entity Framework - Caricamento esplicito

Quando hai disabilitato il caricamento lento, è ancora possibile caricare lentamente le entità correlate, ma deve essere fatto con una chiamata esplicita.

  • A differenza del caricamento lento, non ci sono ambiguità o possibilità di confusione riguardo al momento in cui viene eseguita una query.

  • Per fare ciò si utilizza il metodo Load sulla voce dell'entità correlata.

  • Per una relazione uno-a-molti, chiama il metodo Load in Collection.

  • E per una relazione uno-a-uno, chiama il metodo Load su Riferimento.

Diamo un'occhiata al seguente esempio in cui il caricamento lento è disabilitato e quindi viene recuperato lo studente il cui nome è Ali.

Le informazioni sugli studenti vengono quindi scritte sulla console. Se si guarda il codice, vengono scritte anche le informazioni sulle registrazioni, ma l'entità Enrollments non è ancora caricata, quindi il ciclo foreach non verrà eseguito.

Dopo che l'entità Iscrizioni viene caricata in modo esplicito, le informazioni sugli studenti e le informazioni sulle iscrizioni verranno scritte nella finestra della console.

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();
      }
   }
}

Quando viene eseguito l'esempio precedente, riceverai il seguente output. Per prima cosa vengono visualizzate solo le informazioni sullo studente e, dopo aver caricato esplicitamente l'entità delle iscrizioni, vengono visualizzate sia lo studente che le relative informazioni sulle iscrizioni.

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

Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.