Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

Eager Loading no Entity Framework 4.0


Tem se falado bastante sobre uma das novas funcionalidades do Entity Framework 4.0, o Lazy Loading. Com o Lazy Loading habilitado conseguimos com que as propriedades de navegação para outras entidades nos nossos objetos sejam carregadas apenas no momento em que forem chamadas.Dado o seguinte modelo de entidades:

Com a opção de Lazy Loading habilitada no EF4 quando eu trouxer um objeto Lista do meu contexto(banco de dados) a propriedade Itens estará vazia, e só será preenchida no momento em que eu acessar a mesma. Por exemplo:

1 var ctx = new EF4Contexto();
2 var lista = ctx.Listas.First();
3 //neste momento a propriedade Itens ainda está vazia, nem foi carregada
4 var nome = lista.Nome;
5 //neste exato momento é executada uma query no banco de dados para preenhcer os Itens
6 var itens = lista.Itens;

Este é o comportamento padrão do EF4. O que acontece se desligarmos o Lazy Loading e quisermos trabalhar com Eager Loading? Resposta: Nada! Exatamente isso, nada acontece. Se você achou que a propriedade Itens seria carregada juntamente com o objeto Lista está enganado. Pois bem, não vou entrar no mérito da discussão deste comportamento

Eager Loading

Eager Loading, ou "carga prematura", diz respeito a carregar todas as relações de uma entidade no mesmo momento em que esta entidade é carregada. É o contrário do Lazy Loading.

Para trazer as propriedades de navegação(associação com outras entidades) que quisermos ao carregar a raiz, precisamos utilizar o método Include.

Veja o exemplo:

var ctx = new EF4Contexto();
ctx.ContextOptions.LazyLoadingEnabled = false;
var lista = ctx.Listas.First();

//Não é carregada esta propriedade
var itens = lista.Itens;

Agora utilizando Include:

1 var ctx = new EF4Contexto();
2 ctx.ContextOptions.LazyLoadingEnabled = false;
3 var lista = ctx.Listas.Include("Itens").First();
4 
5 //Aqui a propriedade Itens já está preenchida
6 var itens = lista.Itens;

Na linha 3 dizemos para o EF que estamos incluindo nesta query a propriedade Itens dos objetos Lista, desta forma estas propriedades devem ser carregadas juntamente com estes objetos.

Você pode comprovar tudo isso executando o Sql Profiler enquanto faz esta brincadeira.

Um outro ponto bastante falho ao meu ver é que o Include não é tipado, ou seja, eu posso errar o nome da propriedade. Deveria haver uma forma de fazer isso utilizando Lambda Expressions.

Em um próximo post vou colocar aqui um código que faz isso, um extension method que disponibiliza um Include tipado usando lambda expressions.

Att,

Vinicius Quaiato.

Voltar

Fork me on GitHub