Sobes.tech
Middle

Comment la mise en cache est-elle effectuée dans Entity Framework Core?

sobes.tech IA

Réponse de l'IA

Entity Framework Core (EF Core) possède une mise en cache à deux niveaux:

  1. Cache de contexte (Résolution d'identité): C'est le cache de premier niveau. EF Core suit les entités chargées dans le DbContext actuel. Si lors d'une requête EF Core trouve une entité avec la même clé en mémoire, il retourne l'instance existante au lieu de requêter la base de données.

    • Empêche de charger plusieurs fois les mêmes données dans un même contexte.
    • Met à jour automatiquement les instances en mémoire lorsque leur état change (ajout, modification, suppression).
    • Fonctionne par défaut et ne nécessite pas de configuration spéciale.
  2. Cache de requêtes (Query Caching): C'est le cache de second niveau. EF Core met en cache les plans d'exécution des requêtes SQL générées. Lorsqu'une même requête est exécutée, EF Core peut utiliser un plan déjà compilé, évitant de recompilier le SQL.

    • Optimise la performance des requêtes répétées avec la même structure (mais paramètres différents).
    • Ne stocke pas le résultat de la requête (les données elles-mêmes), mais le plan d'exécution.
    • Géré par des mécanismes internes d'EF Core et n'est pas accessible directement pour la configuration ou le nettoyage externes.

Exemple de fonctionnement du cache de contexte:

// supposons qu'un User avec Id == 1 existe dans la base de données
using (var context = new AppDbContext())
{
    // Premier chargement - requête à la BD
    var user1 = context.Users.FirstOrDefault(u => u.Id == 1);
    Console.WriteLine($"User1 chargé: {user1.Name}");

    // Deuxième chargement - l'objet est récupéré du cache du contexte
    var user2 = context.Users.FirstOrDefault(u => u.Id == 1);
    Console.WriteLine($"User2 chargé: {user2.Name}");

    // user1 et user2 sont des références au même objet en mémoire
    Console.WriteLine($"Les user1 et user2 sont-ils la même référence d'objet? {ReferenceEquals(user1, user2)}");
}

Il est important de comprendre qu'EF Core ne fournit pas de cache de données intégré à l'échelle de l'application (par exemple, pour stocker des données fréquemment utilisées entre les requêtes ou les utilisateurs). Pour ce scénario, on utilise généralement des solutions externes comme Redis, IMemoryCache ou d'autres caches distribués.