Back-End

27 out, 2015

Curso Entity Framework – Explicit Loading

Publicidade

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.