Entity Framework - Chargement explicite

Lorsque vous avez désactivé le chargement différé, il est toujours possible de charger paresseusement les entités associées, mais cela doit être fait avec un appel explicite.

  • Contrairement au chargement différé, il n'y a pas d'ambiguïté ou de possibilité de confusion concernant le moment où une requête est exécutée.

  • Pour ce faire, vous utilisez la méthode Load sur l'entrée de l'entité associée.

  • Pour une relation un-à-plusieurs, appelez la méthode Load sur Collection.

  • Et pour une relation un-à-un, appelez la méthode Load sur Reference.

Jetons un coup d'œil à l'exemple suivant dans lequel le chargement différé est désactivé, puis l'étudiant dont le prénom est Ali est récupéré.

Les informations sur les étudiants sont ensuite écrites sur la console. Si vous regardez le code, les informations d'inscription sont également écrites mais l'entité Enrollments n'est pas encore chargée, donc la boucle foreach ne sera pas exécutée.

Une fois que l'entité Inscriptions est chargée explicitement, les informations sur les étudiants et les inscriptions seront désormais écrites dans la fenêtre de la 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();
      }
   }
}

Lorsque l'exemple ci-dessus est exécuté, vous recevrez la sortie suivante. Tout d'abord, seules les informations sur l'étudiant sont affichées et après le chargement explicite de l'entité d'inscription, les informations sur l'étudiant et ses inscriptions associées sont affichées.

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

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.