Sobes.tech
Middle

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:

  1. Cache de contexto (Resolução de identidade): É o cache de primeiro nível. O EF Core acompanha as entidades carregadas no DbContext atual. 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.
  2. 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.