2012-03-07 11 views
5

Quello che voglio è concettualmente semplice, ma non riesco a capire come sarebbe meglio implementare una cosa del genere.Cache Entity Framework e tracciare le sue modifiche?

Nella mia applicazione Web dispongo di servizi che accedono ai repository che accedono a EF che interagisce con il database di SQL Server. Tutti questi sono istanziati una volta per richiesta web.

Desidero disporre di un livello aggiuntivo tra i repository e EF (o i servizi e i repository?) Che memorizza in modo statico gli oggetti estratti e trasferiti al database.

L'obiettivo, presupponendo che l'accesso DB venga eseguito solo tramite l'applicazione, è che noi conosciamo per il fatto che, a meno che alcuni repository non accedano a EF e impongano una modifica, il set di oggetti non cambia realmente.

Un esempio potrebbe essere:

Repository richiama il metodo GetAllCarrots();

GetAllCarrots() esegui una query in SQL Server recuperato un List<Carrot>, se non altro succede nel frattempo, desidero evitare questa ricerca da essere effettivamente effettuato su SQL Server ogni volta (indipendentemente dal fatto che sia su una richiesta Web diversa, voglio essere in grado di gestire tale scenario)

Ora, se una chiamata a BuyCarrot() aggiunge un Carrot alla tabella, allora voglio che invalidi la cache statica per Carrot s, il che renderebbe GetAllCarrots(); una query al database ancora una volta.

Quali sono alcune buone risorse per il caching del database?

risposta

2

Per questo è possibile utilizzare LinqToCache.

Esso consente di utilizzare il seguente codice all'interno il proprio repository:

var queryTags = from t in ctx.Tags select t; 
var tags = queryTags.AsCached("Tags"); 
foreach (Tag t in tags) 
{ 
    ... 
} 

L'idea è di utilizzare SqlDependency ricevere una notifica quando il risultato di una query cambiamenti. Finché il risultato non cambia, puoi memorizzarlo nella cache.

LinqToCache tiene traccia delle query e restituisce i dati memorizzati nella cache quando richiesto. Quando viene ricevuta una notifica da SqlServer, la cache viene ripristinata.

1

Vi consiglio di leggere lo http://rusanu.com/2010/08/04/sqldependency-based-caching-of-linq-queries/.

Avevo una sfida simile e, a causa dell'uso e delle limitazioni di EF, ho deciso di implementare la cache come servizio aggiuntivo tra il client e il servizio del server, utilizzando un IoC. Monitoraggio di tutti i metodi di servizio che potrebbero influire sui dati memorizzati nella cache.

Off course non è una soluzione perfetta quando si dispone di una farm di server che eseguono i servizi, se l'obiettivo è supportare più server implementare utilizzando SqlDependency.