Entity Framework: carga explícita

Cuando desactivó la carga diferida, aún es posible cargar entidades relacionadas de forma diferida, pero debe hacerse con una llamada explícita.

  • A diferencia de la carga diferida, no hay ambigüedad ni posibilidad de confusión con respecto a cuándo se ejecuta una consulta.

  • Para hacerlo, usa el método Load en la entrada de la entidad relacionada.

  • Para una relación de uno a varios, llame al método Load en Collection.

  • Y para una relación uno a uno, llame al método Load en Reference.

Echemos un vistazo al siguiente ejemplo en el que la carga diferida está deshabilitada y luego se recupera el estudiante cuyo nombre es Ali.

Luego, la información del estudiante se escribe en la consola. Si observa el código, la información de las inscripciones también se escribe, pero la entidad Inscripciones aún no está cargada, por lo que no se ejecutará cada ciclo.

Después de que la entidad Inscripciones se cargue explícitamente, la información del estudiante y la información de las inscripciones se escribirán en la ventana de la consola.

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

Cuando se ejecuta el ejemplo anterior, recibirá el siguiente resultado. Primero, solo se muestra la información del estudiante y después de cargar explícitamente la entidad de inscripciones, se muestra tanto la información del estudiante como la información relacionada con las inscripciones.

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

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.