Como é feito o cache no Entity Framework Core?
sobes.tech IA
Resposta da IA
O Entity Framework Core (EF Core) possui um cache de dois níveis:
-
Cache de contexto (Resolução de identidade): É o cache de primeiro nível. O EF Core acompanha as entidades carregadas no
DbContextatual. Se ao fazer uma consulta o EF Core encontrar uma entidade com o mesmo valor de chave na memória do contexto, ele retorna a instância existente em vez de consultar a base de dados.- Evita carregar os mesmos dados várias vezes no mesmo contexto.
- Atualiza automaticamente as instâncias na memória quando seu estado muda (adicionar, modificar, remover).
- Funciona por padrão e não requer configuração especial.
-
Cache de consultas (Query Caching): É o cache de segundo nível. O EF Core armazena em cache os planos de execução das consultas SQL geradas. Quando a mesma consulta é executada, o EF Core pode usar um plano já compilado, evitando recompilar o SQL.
- Otimiza o desempenho de consultas repetidas com a mesma estrutura (mas parâmetros diferentes).
- Não armazena o resultado da consulta (os dados em si), mas o plano de execução.
- É gerido por mecanismos internos do EF Core e não está acessível diretamente para configuração ou limpeza externas.
Exemplo de funcionamento do cache de contexto:
// assume-se que um User com Id == 1 existe na base de dados
using (var context = new AppDbContext())
{
// Primeira carga - consulta à BD
var user1 = context.Users.FirstOrDefault(u => u.Id == 1);
Console.WriteLine($"User1 carregado: {user1.Name}");
// Segunda carga - o objeto é obtido do cache do contexto
var user2 = context.Users.FirstOrDefault(u => u.Id == 1);
Console.WriteLine($"User2 carregado: {user2.Name}");
// user1 e user2 são referências ao mesmo objeto em memória
Console.WriteLine($"São user1 e user2 a mesma referência de objeto? {ReferenceEquals(user1, user2)}");
}
É importante entender que o EF Core não fornece um cache de dados integrado a nível de aplicação (por exemplo, para armazenar dados frequentemente usados entre consultas ou utilizadores). Para tal cenário, normalmente usam-se soluções externas, como Redis, IMemoryCache ou outros caches distribuídos.