Pílula de Entity Framework 4 -  Lazy Loading


A primeira versão do Entity Framework (versão 1) não suportava uma característica que muitas ferramentas ORM possuem chamada Lazy Loading, e, isso ficava evidente quando você tentava navegar entre associações de entidades (objetos).

Lazy Load é 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, eles são carregados automaticamente quando a propriedade de navegação for acessada.  É também conhecido como "lazy loading".

Nota: Isso eu já havia comentado em meu artigo : Entity Framework - Conceitos Básicos - Usando Lazy Load e Eager Load

Imagine que você tenha uma instância de Pedidos (Orders) a partir do banco de dados Northwind.mdf e desejasse acessar os detalhes dos pedidos (Order Details) para saber  quantos itens de pedidos um pedido possui.

É bem simples fazer isso , primeiro obtemos o pedido e em seguida os seus itens...

O código abaixo vai obter o pedido de número 10248 e a seguir contar quantos itens de pedidos (detalhes) ele possui:

Obs: Para obter um pedido poderíamos também fazer assim : Dim p As Orders = dc.Orders.First

Dim dc As New NORTHWNDEntities

Dim pedido = (From o In dc.Orders Where o.OrderID = 10248
                    
Select o).First

Dim numero_pedidos As Integer = pedido.Order_Details.Count
 

Se você usar a primeira versão do Entity Framework (VS 2008) o resultado será zero, já no Entity Framework 4 o resultado é 3 o que mostra que a versão 1 não suporta Lazy Loading e a nova versão suporta.

Para obter a quantidade de pedidos usando o código acima na  primeira versão do Entity Framework teremos que carregar explicitamente os itens de pedidos no ObjectContext.

Podemos fazer isso incluindo a seguinte linha de código antes da linha que conta os itens do pedido:

Orders.Include(“Order_Details”) (na versão 1)

No Entity Framework 4 podemos ter os dois comportamentos basta configurar a propriedade LazyLoadingEnabled():

1- Habilita o Lazy Loading

dc.ContextOptions.LazyLoadingEnabled = true;

2- Desabilita o Lazy Loading

dc.ContextOptions.LazyLoadingEnabled = false;

Onde dc é a instância do ObjectContext.

A propriedade ObjectContextOptions.LazyLoadingEnabled obtém ou define um valor boleano que determina se objetos relacionados serão carregados automaticamente quando a navegação das propriedades é acessada.

A propriedade LazyLoadinEnabled() também é usada para definir o comportamento lazy loading dos objetos relacionados.

O valor padrão para LazyLoadinEnabled() é false e quando você usa este tipo de loading, significa que cada propriedade de navegação que você acessar irá causar uma consulta separada a ser executada contra a fonte de dados se o objeto não estiver no ObjectContext.

Até o próximo a próxima pílula...

Nota: Eu estou chamando a versão do Entity Framework de versão 4.0 pois ela foi disponibilizada na versão 4.0 da plataforma .NET, mas na verdade é a segunda versão do EF.

Referências:


José Carlos Macoratti