Nesta aula vamos falar sobre Explicit Loading no Entity Framework.
O Explicit Loading, ou carregamento explicito, é muito semelhante ao Lazy Loading, no qual você só recupera os dados quando você explicitamente precisa.
Você pode desejar desativar o lazy loading e ainda ter um controle mais explícito sobre quando os dados relacionados são carregados.
Além de permitir carregar as entidades explicitamente usando o Include, o Entity Framework permite que você seletivamente recupere os dados relacionados usando o método Load.
Assim, mesmo com o Lazy Loading desativado, ainda é possível carregar tardiamente as entidades relacionadas, mas isso deve ser feito com uma chamada explícita.
Para alcançar esse objetivo, use o método Load do objeto DBEntityEntry. Assim, quando os objetos são devolvidos por uma consulta, os objetos relacionados não são carregados ao mesmo tempo.
Por padrão, eles não são carregados até que sejam solicitados utilizando o método Load em uma propriedade de navegação.
Nota: Para desabilitar o lazy loading no Entity Framework, defina a propriedade context.Configuration.LazyLoadingEnabled como false.
Preparando o ambiente
Vamos usar a solução criada na aula Entity Framework – Consultas Projeção para mostrar o recurso Lazy Loading.
Abra a solução EF6_EscolaDB criada nesta aula. Após isso, inclua um novo projeto do tipo Console Application com o nome EF6_ExplicitLoad na solução.
Para concluir, inclua uma referência ao projeto EF6_LazyLoad para o projeto EF6_EscolaDB e inclua também a string de conexão no arquivoApp.Config do projeto template.
A seguir, inclua o código abaixo no arquivo Program.cs:
Consulta LINQ:
private static void consulta_ExplicitLoading() { using (var ctx = new EscolaDBEntities()) { //desabilita o lazy loading ctx.Configuration.LazyLoadingEnabled = false; //consulta o aluno por nome var aluno = (from s in ctx.Alunos where s.AlunoNome == "Macoratti" select s).FirstOrDefault<Aluno>(); //carrega os cursos para o aluno usando explicit loading ctx.Entry(aluno).Collection(s => s.Cursos).Load(); } }
Versão VB .NET
Private Shared Sub consulta_ExplicitLoading() Using ctx = New EscolaDBEntities() 'desabilita o lazy loading ctx.Configuration.LazyLoadingEnabled = False 'consulta o aluno por nome Dim aluno = (From s In ctx.Alunos Where s.AlunoNome = "Macoratti" select s).FirstOrDefault(Of Aluno)() 'carrega os cursos para o aluno usando explicit loading ctx.Entry(aluno).Collection(Function(s) s.Cursos).Load() End Using End Sub
No código acima estamos selecionando um aluno de nome igual a Macoratti e carregando os cursos deste aluno usando a carga explicita via métodoLoad.
Como estamos carregando uma coleção de cursos usando a propriedade de navegação, usamos o método Collection para fazer isso ao invés do métodoReference:
Usamos: ctx.Entry(aluno).Collection(s => s.Cursos).Load();
Ao invés de: ctx.Entry(aluno).Reference(s => s.Cursos).Load();
O método de extensão Load funciona como ToList, exceto que ele evita a criação da lista completamente.
Na próxima aula vamos tratar do Rastreamento de mudanças (Change Tracking) no Entity Framework.