Nesta aula vamos falar sobre Eager Loading no Entity Framework, que é o mecanismo pelo qual uma associação, coleção ou atributo é carregado imediatamente quando o objeto principal é carregado.
Dessa forma, todas as relações de uma entidade serão carregadas no mesmo momento em que esta entidade é carregada. É o contrário do Lazy Loading, que é o mecanismo utilizado pelos frameworks de persistência para carregar informações sob demanda. Esse mecanismo torna as entidades mais leves, pois suas associações são carregadas apenas no momento em que o método que disponibiliza o dado associativo é chamado.
Assim, quando objetos são retornados por uma consulta, os objetos relacionados não são carregados ao mesmo tempo, ao invés, eles são carregados automaticamente quando a propriedade de navegação for acessada.
Preparando o ambiente
Vamos usar a solução criada na aula anterior para mostrar o recurso Eager Loading.
Abra a solução EF6_EscolaDB criada na aula anterior. Após isso, inclua um novo projeto do tipo Console Application com o nome EF6_EagerLoad na solução.
No Menu FILE, clique em Add -> New Project e selecione o template Visual C# -> Console Application informando o nome EF6_EagerLoad:
Para concluir, inclua uma referência no projeto EF6_EagerLoad para o projeto EF6_EscolaDB, inclua também a string de conexão do projetoEF6_EscolaDB no arquivo App.Config do projeto atual.
A seguir, inclua o código abaixo no arquivo Program.cs:
Consulta LINQ
private static void consulta_Eager_Loading1() { using (var ctx = new EscolaDBEntities()) { var aluno = (from a in ctx.Alunos.Include("Padrao") where a.AlunoNome == "Janice" select a).FirstOrDefault<Aluno>(); Console.WriteLine(aluno.Cursos..PadraoId.ToString()); Console.WriteLine(aluno.Padrao.PadraoNome.ToString()); Console.ReadKey(); } }
Método LINQ usando expressão lambda
private static void consulta_Eager_Loading1() { using (var ctx = new EscolaDBEntities()) { var _aluno = ctx.Alunos.Include("Padrao").Where(a => a.AlunoNome == "Janice").FirstOrDefault(); Console.WriteLine(_aluno.Padrao.PadraoId.ToString()); Console.WriteLine(_aluno.Padrao.PadraoNome.ToString()); Console.ReadKey(); } }
O código demonstra o recurso eager loading, onde a entidade Padrao será também carregada com a entidade Alunos, usando o método Include.
Podemos também usar o recurso eager loading para carregar múltiplos níveis de entidades relacionadas.
No código abaixo temos um exemplo que mostra como carregar as entidades Aluno, Padrao e Professores relacionadas:
private static void consulta_Eager_Loading2() { using (var ctx = new EscolaDBEntities()) { var aluno = (from a in ctx.Alunos.Include("Padrao.Professores") where a.AlunoNome == "Janice" select a).FirstOrDefault<Aluno>(); Console.ReadKey(); } }
No eager load é preciso informar o caminho completo das associações que você deseja recuperar, caso contrário, os objetos não serão carregados.
Na próxima aula vamos tratar Lazy Loading no Entity Framework.