2016-07-18 17 views
1

Ich habe einige Datentabellen, die fast nie ändern, so dass ich nicht jedes Mal Datenbank aufrufen möchte, wenn ich eine Abfrage auf DB-Kontext ausführen. In NHibernate gibt es dafür eine Option im Mapper: Cache.ReadOnly();Cache-Tabelle mit Entity-Framework

Und es wird die gesamte Tabelle in Ihrem Cache beim Start und jedes Mal, wenn Sie das Objekt wie mit Lazy Loading laden möchten, wird es stattdessen Daten aus dem zwischengespeicherten Speicher abrufen.

Wie kann ich das gleiche mit Entity-Framework machen?

+0

Welche Version von Entity Framework verwenden u? – Eldho

Antwort

1

Mit .Single, .First, .Where etc wird die Ergebnisse nicht cachen, es sei denn Sie Second-Level-Cache verwenden.

Wenn Sie das Ergebnis zwischenspeichern müssen, müssen Sie das Second-Level-Caching in EF implementieren.

EntityFramework.Cache ermöglicht das Zwischenspeichern von Abfrageergebnissen für EF 6.1-Anwendungen.

müssen wir EF mitteilen, dass Caching verwendet wird, indem der Caching-Provider und der Transaktionshandler konfiguriert werden.

public class Configuration : DbConfiguration 
{ 
    public Configuration() 
    { 
     var transactionHandler = new CacheTransactionHandler(new InMemoryCache()); 
     AddInterceptor(transactionHandler); 
     var cachingPolicy = new CachingPolicy(); 
     Loaded +=(sender, args) => args.ReplaceService<DbProviderServices>(
      (s, _) => new CachingProviderServices(s, transactionHandler, 
      cachingPolicy)); 
    } 

} 
1

Sie können Entity Framework Extended Library für Ihren Zweck versuchen. Mit Hilfe dieser Bibliothek können Sie so etwas wie dieses

//query is cached using the default settings 
    var c = db.Countries.Where(t => t.IsActive).FromCache(); 

schreiben Es ist nicht genau das, was Sie wollen, aber wenn Sie ein Repository Muster verwenden, können Sie diese Logik kapseln.

Ein anderer Ansatz: Wenn Sie nur eingebaute Sachen verwenden möchten, können Sie die Local Eigenschaft verwenden.

Beispiel:

db.Countries.Load(); // load to cache 
var countriesFromEFCache = db.Countries.Local; 

foreach (var county in countriesFromEFCache) // There is not any db query here 
{ 
    ... 
} 
+0

Hallo Awesome :) Danke für die Antwort. Aber es ist etwas anderes. Es wird die Ergebnisse der Abfrage zwischenspeichern und Sie müssen ".FromCache()" für jede Abfrage schreiben, die Sie verwenden. Gibt es keine eingebauten Sachen für diese einfache Aufgabe? –

+0

Leider EF hat nur First-Level-Cache und wenn Sie möchten, dass universelle Ansatz als Sie https://efcache.codeplex.com/ –

+0

@AshkanSirous überprüfen können, überprüfen Sie bitte mein Update, kann es hilfreich sein –