Nelle applicazioni .NET ad alto numero di transazioni, il database rappresenta spesso il principale collo di bottiglia. Sebbene Entity Framework (EF) Core sia un potente Object-Relational-Mapping (ORM), continua a intercettare il database per ogni singola query, causando colli di bottiglia nelle prestazioni e problemi di scalabilità.
Entity Framework Core Caching risolve questo problema introducendo una cache distribuita in memoria, NCache, tra l'applicazione e il database. Intercettando le query LINQ, fornisce istantaneamente i dati a cui si accede frequentemente dalla cache, riducendo drasticamente i costosi accessi al database.
FromCache() and LoadIntoCache() senza modificare le query.Per iniziare, assicurati di avere un NCache cache cluster in esecuzione.
Esegui il seguente comando nella console di Gestione pacchetti. Assicurati di selezionare la versione compatibile con la tua release .NET (ad esempio, .NET 10).
Install-Package EntityFrameworkCore.NCache
In .NET 8/10, la serializzazione binaria è limitata. Fortunatamente, NCache Supporta la serializzazione JSON pronta all'uso, ideale per le moderne app .NET. Assicurati che le classi delle entità siano pubbliche e abbiano costruttori senza parametri.
L'integrazione di NCache con EF Core avviene principalmente all'interno del tuo DbContext. Devi configurare NCache come fornitore di cache durante l'avvio dell'applicazione o la configurazione del contesto.
Modifica del DbContext
Sostituisci il metodo OnConfiguring nel tuo DbContext per connetterti a NCache.
using Alachisoft.NCache.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
private readonly IConfiguration _configuration;
// Inject configuration via constructor
public AppDbContext(DbContextOptions<AppDbContext> options, IConfiguration configuration)
: base(options)
{
_configuration = configuration;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 2. Unique Cache ID configured in NCache Manager
string cacheId = _configuration["NCacheSettings:CacheId"];
// 3. Target-typed new expression (C# 9+) - Type is inferred from variable
CacheConnectionOptions ncacheOptions = new()
{
RetryInterval = TimeSpan.FromSeconds(2),
ConnectionRetries = 2
};
// 4. Initialize the NCache provider
// DependencyType.SqlServer ensures cache syncs with SQL DB changes
NCacheConfiguration.Configure(cacheId, DependencyType.SqlServer, ncacheOptions);
base.OnConfiguring(optionsBuilder);
}
}
NCache estende IQueryable con metodi personalizzati. Ciò consente di memorizzare nella cache i risultati direttamente all'interno della pipeline LINQ.
Il modello Cache-Aside (FromCache)
Questo è il metodo più comune. Controlla prima la cache; se mancano dati, li recupera dal database, memorizza nella cache il risultato e lo restituisce.
// Standard LINQ query with caching enabled
var activeCustomers = _context.Customers
.Where(c => c.IsActive)
.FromCache(); // Checks cache first, then DB
Popolamento della cache con dati di riferimento (LoadIntoCache)
Utilizzalo per i "Dati di riferimento" (tabelle di consultazione, cataloghi prodotti). Recupera sempre dal database e aggiorna la cache, garantendone l'aggiornamento.
// Forces a DB trip and updates the cache
var products = _context.Products
.LoadIntoCache();
Query solo cache per dati di riferimento (FromCacheOnly)
Questa query interroga solo la cache e non il database. Se mancano dati, restituisce un risultato vuoto o genera un'eccezione (configurabile). Questa è la soluzione ideale per i dati di riferimento che vengono letti frequentemente con letture ultraveloci.
var cachedOrders = _context.Orders
.Where(o => o.Region == "US")
.FromCacheOnly();
Esecuzione differita (DeferredCount, DeferredFirst)
Operatori standard come, .Count() or .FirstOrDefault(), esegui immediatamente, bypassando l'intercettore della cache. NCache fornisce alternative "differite" per ritardare l'esecuzione finché non viene applicata la logica della cache.
// INCORRECT: Hits DB immediately
// var count = _context.Customers.Count();
// CORRECT: Defers execution so caching can work
var count = _context.Customers.DeferredCount().FromCache();
È possibile controllare la scadenza e la sincronizzazione utilizzando la classe CachingOptions.
È possibile impedire che la cache cresca indefinitamente impostando regole di scadenza in modo che i dati più vecchi vengano automaticamente rimossi dalla cache alla scadenza.
// 1. Target-typed new expression (inferred type)
CachingOptions options = new()
{
StoreAs = StoreAs.SeperateEntities,
Priority = CacheItemPriority.High
};
// 2. Setting Expiration (Best Practice: Use UtcNow for distributed systems)
options.SetAbsoluteExpiration(DateTime.UtcNow.AddMinutes(10));
// 3. Executing the query
var topSellers = _context.Sellers.FromCache(options);
Per garantire che la cache non sia mai obsoleta, abilitare CreateDbDependency. In questo modo viene configurato un watcher sulle righe del server SQL.
var syncOptions = new CachingOptions
{
CreateDbDependency = true // Auto-remove from cache if SQL row changes
};
var specificOrder = _context.Orders
.Where(o => o.Id == 10248)
.FromCache(syncOptions);
FromCache() le query non dovrebbero mostrare nuove tracce in SQL Profiler.La configurazione della memorizzazione nella cache di Entity Framework in .NET 8 e 10 è semplice con NCacheAggiungendo un semplice FromCache() Con il metodo di estensione, puoi scaricare le letture dal tuo database e ottenere tempi di risposta inferiori al millisecondo.
installare il EntityFrameworkCore.NCache Pacchetto NuGet nel tuo ambiente di staging e misura la differenza di prestazioni sulle query di lettura più pesanti.
FromCache() per abilitare il comportamento cache-aside per le query LINQ senza riscriverle.LoadIntoCache() per dati di riferimento/ricerca che si desidera popolare e aggiornare in modo proattivo nella cache, come cataloghi o tabelle di configurazione.Count() può essere eseguito immediatamente e aggirare l'intercettazione della cache. NCache fornisce alternative differite (ad esempio DeferredCount()) quindi la logica della cache viene applicata prima dell'esecuzione.EntityFrameworkCore.NCache il provider è completamente compatibile con .NET 8/10 su Linux e Windows.È possibile accedere all'handle della cache direttamente dal contesto oppure utilizzare i tag (identificatori di query) per rimuovere gruppi di dati.
_context.GetCache().Remove(entity);FromCache() memorizza nella cache il set di risultati finali della query LINQ. Tuttavia, assicurarsi che gli oggetti risultanti siano serializzabili.© Copyright Alachisoft 2002 - . Tutti i diritti riservati. NCache è un marchio registrato di Diyatech Corp.