Sobes.tech
Middle

Hogyan történik a cache-elés az Entity Framework Core-ban?

sobes.tech MI

Válasz az MI-től

A Entity Framework Core (EF Core) két szintű gyorsítótárazással rendelkezik:

  1. Kontekstus gyorsítótár (Identitás feloldás): Ez az első szintű gyorsítótár. Az EF Core nyomon követi a DbContext aktuális betöltött entitásait. Ha egy lekérdezés során az EF Core ugyanazzal a kulcsértékkel rendelkező entitást talál a memóriában, akkor a meglévő példányt adja vissza, nem kérdezi le az adatbázisból.

    • Megakadályozza ugyanazon adatok többszöri betöltését ugyanabban a kontextusban.
    • Automatikusan frissíti a memóriában lévő példányokat, amikor azok állapota változik (hozzáadás, módosítás, törlés).
    • Alapértelmezés szerint működik, és nem igényel külön konfigurációt.
  2. Lekérdezés gyorsítótár (Query Caching): Ez a második szintű gyorsítótár. Az EF Core cache-eli a generált SQL lekérdezések végrehajtási terveit. Amikor ugyanazt a lekérdezést futtatják, az EF Core már lefordított tervet használhat, elkerülve az SQL újrafordítását.

    • Optimalizálja az ugyanazzal a szerkezettel ismétlődő lekérdezések teljesítményét (de különböző paraméterekkel).
    • Nem a lekérdezés eredményét (az adatokat), hanem a végrehajtási tervet tárolja.
    • Az EF Core belső mechanizmusai által kezelt, és nem érhető el közvetlenül külső konfiguráció vagy tisztítás céljából.

Példa a kontextus gyorsítótár működésére:

// feltételezzük, hogy egy Id == 1 felhasználó létezik az adatbázisban
using (var context = new AppDbContext())
{
    // Első betöltés - lekérdezés az adatbázisból
    var user1 = context.Users.FirstOrDefault(u => u.Id == 1);
    Console.WriteLine($"User1 betöltve: {user1.Name}");

    // Második betöltés - az objektum a kontextus gyorsítótárából származik
    var user2 = context.Users.FirstOrDefault(u => u.Id == 1);
    Console.WriteLine($"User2 betöltve: {user2.Name}");

    // a user1 és user2 ugyanarra az objektumra mutat
    Console.WriteLine($"Egyenlőek a user1 és user2 referenciai? {ReferenceEquals(user1, user2)}");
}

Fontos megérteni, hogy az EF Core nem nyújt beépített alkalmazás szintű adat gyorsítótárat (például gyakran használt adatok tárolására kérdések vagy felhasználók között). Ilyen esetekben általában külső megoldásokat, például Redis-t, IMemoryCache-t vagy más elosztott gyorsítótárakat használnak.