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:
-
Kontekstus gyorsítótár (Identitás feloldás): Ez az első szintű gyorsítótár. Az EF Core nyomon követi a
DbContextaktuá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.
-
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.