LazyLoad EF Core 2.1(Preview)
- Carregamento explícito
- Carregamento adiantado
- Carregamento preguiçoso (LazyLoad disponível para o EF Core a partir da Versão 2.1)
(Autor,Livro e ExemploContext)
1 – Primeira Classe chamada Autor, o autor pode ter vários livros.
public class Autor
{
public int Id { get; set; }
public string Nome { get; set; }
public virtual IEnumerable<Livro> Livros {get;set;}
}
2 – Segunda Classe chamada Livro
public class Livro
{
public int Id { get; set; }
public string Descricao { get; set; }
public DateTime DataLancamento { get; set; }
public int AutorId { get; set; }
public Autor Autor { get; set; }
}
3 – E Enfim nosso DbContext
public class ExemploContext : DbContext
{
private const string StringConexao
= @"Server=.\Sql2016;Database=LazyLoadArtigo;Integrated Security=True;ConnectRetryCount=0";
public DbSet<Autor> Autores { get; set; }
public DbSet<Livro> Livros { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Para habilitar o uso do LazyLoad remova o comentário da linha abaixo
// optionsBuilder.UseLazyLoadingProxies();
optionsBuilder.UseSqlServer(StringConexao);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Livro>()
.HasOne(p => p.Autor)
.WithMany(p => p.Livros)
.HasForeignKey(p => p.AutorId);
}
}
Classes criadas agora vamos entender os conceitos dos três tipos básicos de carregamento citados acima.
1 - O que é um carregamento explícito?
// Buscar um autor
var autor = db
.Autores
.FirstOrDefault(p=> p.Id == 1);
Resultado SQL:
SELECT TOP(1) [p].[Id], [p].[Nome]
FROM[Autores] AS[p]
WHERE[p].[Id] = 1
Até aqui os livros não foram carregados ainda, mas para carregar basta executar o procedimento abaixo.
Esse procedimento é chamado de “Carregamento Explícito”, pelo motivo de executarmos ele de forma manual, apenas quando existe a necessidade de preencher uma propriedade de navegação.
// Carregar os livros do autor de forma explícita
db.Entry(autor)
.Collection(b => b.Livros)
.Load();
2 - O que é um carregamento adiantado?
Ou seja, quando o Entity Framework Core irá montar uma query onde retornará os resultados como parte de uma consulta única, efetuando um INNER JOIN com as tabelas que tem relacionamentos, para isso basta fazer o uso do Include, como mostro no exemplo abaixo:
var autorAdiantado = db
.Autores
.Include(p=>p.Livros)
.ToList();
3 - O que é um carregamento preguiçoso?
O Entity Framework por sua vez, faz uma requisição no servidor e preenche os dados da propriedade automaticamente, diferente do uso explícito e adiantado.
Até a versão 2.0.1 não era possível a utilização do LazyLoad com Entity Framework Core recentemente isso foi implementado, e estará disponível na versão 2.1 do ORM, esse foi um dos assuntos mais discutidos nos bastidores do projeto.
O carregamento preguiçoso é mas simplificado, bastando apenas efetuar a consulta principal, e as propriedades de navegação automaticamente serão preenchidas no momento que forem acessadas.
Exemplo:
var autorLazyLoad = db.Autores.ToList();
Pronto bem simples, não é?! O restante é por conta do EF Core. A implementação do LazyLoad foi feita em um pacote especifico chamado:
Microsoft.EntityFrameworkCore.Proxies
Para habilitar o uso do LazyLoad no EF Core basta instalar o pacote acima informado e fazer a chamada do método em OnConfiguring no seu DbContext assim:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
optionsBuilder.UseSqlServer(StringConexao);
}
Você também pode adicionar o LazyLoad como injeção de dependência, no Asp.Net Core basta utilizar o exemplo abaixo:
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkProxies();
}
Observação: para o LazyLoad funcionar, as propriedades de navegação obrigatoriamente devem ser públicas e virtuais.
Os pacotes instalados para o exemplo deste artigo foram:
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Proxies
- Microsoft.EntityFrameworkCore.SqlServer
(Compilação noturna – Preview)
O projeto de exemplo está no Github acesse aqui!
Abraços e até o próximo!
Deixe um comentário