Nesta aula iremos abordar o Lazy Loading, que é o mecanismo utilizado pelos frameworks de persistência para carregar informações sobre 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 disso, eles são carregados automaticamente quando a propriedade de navegação for acessada.
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 nesta aula para mostrar o recurso Lazy Loading.
Abra a solução EF6_EscolaDB criada na aula anterior. Logo após, inclua um novo projeto do tipo Console Application com o nome EF6_LazyLoad na solução.
Para concluir, inclua uma referência ao projeto EF6_LazyLoad para o projeto EF6_EscolaDB. Inclua a string de conexão no arquivo App.Config do projeto.
No Lazy Loading, o Entity Framework adia o carregamento das entidades relacionadas até você especificar isso em uma requisição explicitamente.
Vejamos um exemplo deste comportamento no trecho de código abaixo, onde estamos obtendo os alunos e, a seguir, seus endereços.
A classe Aluno contém a propriedade complexa AlunoEndereco.
No modo padrão, o contexto do EF atua da seguinte forma:
- Primeiro carrega todos os alunos do banco de dados;
- Então, ele irá carregar os endereços de um aluno particular quando o acesso à propriedade AlunoEndereco for feita.
Versão C#
private static void consulta_Lazy_Loading1() { using (var ctx = new EscolaDBEntities()) { //carrega apenas os alunos IList<Aluno> listaAlunos = ctx.Alunos.ToList<Aluno>(); Aluno aluno = listaAlunos[0]; //carrega os enderecos para um aluno particular AlunoEndereco ende = aluno.AlunoEndereco; } }
Versão VB .NET
Private Shared Sub consulta_Lazy_Loading1() Using ctx = New EscolaDBEntities() 'carrega apenas os alunos Dim listaAlunos As IList(Of Aluno) = ctx.Alunos.ToList(Of Aluno)() Dim aluno As Aluno = listaAlunos(0) 'carrega os enderecos para um aluno particular Dim ende As AlunoEndereco = aluno.AlunoEndereco End Using End Sub
Temos aqui o que é conhecido como Lazy Load, ou em outras palavras “se o programador não solicitar a carga, o relacionamento entre entidades não será recuperado”.
Na próxima aula vamos tratar do Explicity Loading no Entity Framework.