Entity Framework - carregamento explícito

Quando você desabilitou o carregamento lento, ainda é possível carregar entidades relacionadas de forma lenta, mas isso deve ser feito com uma chamada explícita.

  • Ao contrário do carregamento lento, não há ambigüidade ou possibilidade de confusão sobre quando uma consulta é executada.

  • Para fazer isso, você usa o método Load na entrada da entidade relacionada.

  • Para um relacionamento um para muitos, chame o método Load em Collection.

  • E para um relacionamento um a um, chame o método Load na Referência.

Vamos dar uma olhada no exemplo a seguir, no qual o carregamento lento é desabilitado e, em seguida, o aluno cujo primeiro nome é Ali é recuperado.

As informações do aluno são então gravadas no console. Se você olhar o código, as informações de inscrições também serão gravadas, mas a entidade Enrollments ainda não foi carregada, portanto, o loop foreach não será executado.

Depois que a entidade de inscrições for carregada explicitamente, as informações do aluno e as informações de inscrições serão gravadas na janela do 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 o exemplo acima for executado, você receberá a seguinte saída. Primeiro, apenas as informações do aluno são exibidas e, depois de carregar explicitamente a entidade de matrículas, tanto o aluno quanto suas informações de matrícula relacionadas são exibidas.

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

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.