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.