Como funciona o acesso ao banco para carregar os Objetos Relacionais do Entity Framework

Olá pessoal,

Uma dica rápida e muito interessante a se saber sobre o entity framework e o seu carregamento dos objetos relacionais utilizando seus métodos de loading.

entity_imageBom galera, abaixo cobrirei cada tipo de loading que o EF possui, que são: lazy loading, eager loading e expliciting loading

Lazy Loading

Esse tipo de loading é o mais usado e também é o padrão do EF quando nenhum é especificado. Mas lembre-se, não é por que é o padrão que é o que você deve utilizar, depende do seu projeto e das regras que voce quer aplicar, e também, pela quantidade de dados que voce tem, isso que é um fator principal para tomar a decisão de qual tipo usar.

Ao realizar uma query utilizando lazy loading a entidade pai é carregada totalmente, onde seus filhos (objetos relacionados a este), são carregados somente quando acessados. Exemplo:

public class Blog
{
   public int BlogId { get; set; }
   public string Name { get; set; }
   public string Url { get; set; }
   public string Tags { get; set; }

   public virtual ICollection Posts { get; set; }
}

Esta entidade sendo carregada no modo lazy:

var blogs = context.Blogs

Carregará todas as propriedades de blog, de menos a coleção de posts. Porém, se você como desenvolvedor adicionar a seu código:

blogs.Posts

O Entity Framework irá realizar uma query para cada um dos posts de blogs. Fazendo com que seja um problema N+1. Se existirem 100 posts para o blog, serão realizadas 101 consultas. Então, usar o lazy loading tem que ter consciência deste detalhe importante. Tem como cancelar este tipo de loading do próprio context, para evitar que as entidades seja consultadas desta forma.

Eager Loading

Neste tipo, o que acontece é o contrário. Todas as entidades já são carregadas em uma unica query. Exemplo:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

Como no lazy, também é possivel desativar este tipo de loading no context.

Expliciting Loading

Mesmo quando no context está desativado o modo lazy, você pode fazer este tipo de chamada explicitamente. Utilizando o “.Load()”. Exemplo:

using (var context = new BloggingContext()) 
{ 
    var post = context.Posts.Find(2); 
 
    // Load the blog related to a given post 
    context.Entry(post).Reference(p => p.Blog).Load(); 
}

Conclusão

Isso ai pessoal. Achei muito legal aprender isso por que as vezes estamos agachando a nossa aplicação e performance e podemos pensar que a culpa é do framework ORM, no caso o EF. Mas na verdade o erro que está sendo cometido é o método que esta sendo utilizado para carregar os objetos relacionais do banco de dados. Espero que isso seja útil.

Referencias:

Enjoy! 😀

Kelvin

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s