Carregamentos
Existem três principais estratégias de carregamento de dados relacionadas a propriedades de navegação:
- Eager Loading: Carrega todas as propriedades de navegação de uma entidade ao mesmo tempo que a entidade principal é carregada.
- Explicit Loading: Carrega propriedades de navegação sob demanda, após a entidade principal já ter sido carregada.
- Lazy Loading: Carrega automaticamente as propriedades de navegação apenas quando elas são acessadas pela primeira vez.
Exemplo de Propriedade de Navegação
Vamos considerar uma classe Artista
que tem uma coleção de Musica
como propriedade de navegação:
public class Artista
{
public int Id { get; set; }
public string Nome { get; set; }
public virtual ICollection<Musica> Musicas { get; set; } = new List<Musica>();
}
Antes da Implementação de Lazy Loading
Eager Loading
Para carregar um Artista
e suas músicas de uma vez, você deve usar Include
:
var artista = context.Artistas
.Include(a => a.Musicas)
.FirstOrDefault(a => a.Id == artistaId);
Neste caso, o Entity Framework gera uma consulta SQL que inclui a junção com a tabela Musicas
para carregar todas as músicas do Artista
de uma vez.
Explicit Loading
Se você carregar apenas o Artista
, mas quiser carregar as músicas depois, pode fazer assim:
var artista = context.Artistas.FirstOrDefault(a => a.Id == artistaId);
context.Entry(artista).Collection(a => a.Musicas).Load();
Aqui, primeiro você carrega o Artista
e depois explicitamente carrega a coleção Musicas
.
Depois da Implementação de Lazy Loading
Com lazy loading habilitado, você não precisa usar Include
ou explicitamente carregar as propriedades de navegação. O Entity Framework faz isso automaticamente quando você acessa a propriedade de navegação pela primeira vez.
Exemplo de Lazy Loading
var artista = context.Artistas.FirstOrDefault(a => a.Id == artistaId);
var musicas = artista.Musicas; // `Musicas` é carregado automaticamente quando acessado
Quando você acessa artista.Musicas
, o Entity Framework verifica se a coleção Musicas
já está carregada. Se não estiver, ele gera automaticamente uma consulta ao banco de dados para buscar as músicas do Artista
e as carrega.
Benefícios de Lazy Loading
Simplicidade no Código:
- Você não precisa usar
Include
ou carregar explicitamente as propriedades de navegação. O código se torna mais limpo e focado na lógica de negócios.
Carregamento Sob Demanda:
- As propriedades de navegação são carregadas apenas quando são realmente necessárias. Isso pode reduzir a quantidade de dados carregados inicialmente, melhorando a performance e a eficiência em cenários onde nem todas as propriedades são sempre usadas.
Considerações
Embora lazy loading possa simplificar o código e melhorar a eficiência em muitos casos, ele também pode introduzir problemas de performance se não for usado com cuidado. Por exemplo, acessar propriedades de navegação em um loop pode resultar em múltiplas consultas ao banco de dados, o que pode ser ineficiente.
Resumo
- Lazy Loading: Propriedades de navegação são carregadas automaticamente quando acessadas pela primeira vez.
- Simplicidade: Reduz a necessidade de
Include
e explicit loading no código. - Carregamento Sob Demanda: Melhora a eficiência carregando dados apenas quando necessário.
- Considerações de Performance: Pode introduzir múltiplas consultas ao banco de dados, impactando a performance se não for usado com cuidado.