Das Entity Framework ist eine Reihe von Technologien in ADO.NET, die die Entwicklung datenorientierter Softwareanwendungen unterstützen. Mit dem Entity Framework können Entwickler beim Umgang mit Daten auf einer höheren Abstraktionsebene arbeiten und datenorientierte Anwendungen mit weniger Code als in herkömmlichen Anwendungen erstellen und warten.
NCache stellt den Caching-Anbieter vor, der zwischen Entity Framework und der Datenquelle agiert. Der Hauptgrund hinter der EF-Caching-Anbieter besteht darin, Datenbankauslösungen (die die Anwendungsleistung verlangsamen) zu reduzieren und das Abfrageergebnis aus dem Cache bereitzustellen. Der Anbieter agiert zwischen dem ADO.NET-Entitätsframework und der ursprünglichen Datenquelle. Daher können Caching-Anbieter eingesteckt werden, ohne den aktuellen Code zu ändern/kompilieren.
NCache Der Entity Framework Caching-Anbieter arbeitet in zwei Modi. Es kann entweder in "Caching" oder in "Analyse"-Modus. Im Caching-Modus können Sie die Ergebnismenge ausgewählter Abfragen zwischenspeichern. Der Analysemodus arbeitet im Pass-Through-Modus und hilft Ihnen, die Abfragen zu finden, die zwischengespeichert werden sollten, indem er einen Bericht generiert, der zeigt, welche Abfragen mit welcher Häufigkeit aufgerufen werden. Weitere Hilfe zu Integrationsmodi
NCache Der Entity Framework-Anbieter stellt außerdem sicher, dass Daten im Cache immer mit der Datenbank synchronisiert werden. Deshalb NCache verwendet .NET SqlCacheDependeny Dadurch wird eine SQL-Abfrage bei SQL Server registriert. Wenn also eine Zeile in dem durch diese Abfrage dargestellten Dataset in der Datenbank geändert wird, gibt SQL Server eine Ereignisbenachrichtigung an aus NCache. NCache entfernt dann die entsprechende Ergebnismenge aus dem Cache.
1. Sie sollten über eine Entity Framework-Anwendung verfügen. (Sie können auch die Beispielanwendung für EFCaching von verwenden NCache Beispielanwendungen aus dem folgenden Pfad:
"Installiertes Verzeichnis:/ProgramFiles/NCache/samples/clr20/EntityDataModelIntegrationDemo"
In jeder Entity Framework-Anwendung ist das ADO.NET Entity Data Model bereits hinzugefügt, das automatisch zwei Dateien generiert:
2. Microsoft Visual Studio 2010 für Entity Framework 3.5 und 4.0 und Microsoft Visual Studio 2012/2013 für Entity Framework 6.0 und 6.1
3. Datenbanktool (z. B. MS SQL SERVER 2008, ORACLE)
Speichern Alachisoft.Integrations.EntityFramework.CachingProvider
Verweis auf Ihre Entity Framework-Anwendung. Diese DLL-Datei wird im folgenden Pfad abgelegt:
"Installationsverzeichnis:/ProgramFiles/NCache/integration/MSEntityFramework"
Nach dem Hinzufügen der Referenz sind Änderungen in 3 verschiedenen Dateien erforderlich:
In der SSDL-Datei, die beim Hinzufügen des ADO.NET Entity Data Model in der Entity Framework-Anwendung generiert wird, sind folgende Änderungen erforderlich:
Unten sind die Beispieländerungen für eine SQL 2008-Datenbank;
In SSDL wird der Anbietername im Provider-Attribut der angegeben Element wie unten gezeigt:
<Schema Namespace = "NorthwindModel.Store" Alias = "Self" Provider = "System.Data.SqlClient" ProviderManifestToken = "2005"
xmlns:store ="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns ="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
Um unsere zu spritzen NCache Entity Framework Provider, müssen wir die oben hervorgehobenen Attribute überschreiben, um unseren Provider zu integrieren. In SSDL setzen wir den Namen des neuen Anbieters in das Provider-Attribut und verketten den vorherigen Anbieter mit unserem Anbietermanifest-Token in der ProviderManifestToken Feld, wie unten gezeigt:
<Schema Namespace = "NorthwindModel.Store" Alias = "Self"
Provider = "Alachisoft.Integrations.EntityFramework.CachingProvider"
ProviderManifestToken = "System.Data.SqlClient;2005"
xmlns:store = "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns = "http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
Anwendungs- (oder Web-) Konfigurationsdatei, die beim Hinzufügen des ADO.NET Entity Data Model in der Entity Framework-Anwendung generiert wird, erfordert die folgenden Änderungen:
Der unveränderliche Name des Anbieters wird in der Verbindungszeichenfolge der Anwendungs- oder Webkonfigurationsdatei angegeben:
<connectionStrings>
<add name="NorthwindEntities"
connectionString="metadata=res://*/NorthwindCustomerModel.csdl
|res://*/NorthwindCustomerModel.ssdl
|res://*/NorthwindCustomerModel.msl;
provider=System.Data.EntityClient;
provider connection string="
Data Source=localhost;Initial Catalog=Northwind;user id= userid;
password=password;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient"/>
</connectionStrings>
Ändern Sie den Namen des Anbieters in NCache Entity Framework Provider und fügen Sie auch die Provider-Wrapper-Informationen in der Verbindungszeichenfolge hinzu, wie unten gezeigt:
<connectionStrings>
<add name="NorthwindEntities"
connectionString="metadata=res://*/NorthwindCustomerModel.csdl
|res://*/NorthwindCustomerModel.ssdl
|res://*/NorthwindCustomerModel.msl;
provider=Alachisoft.Integrations.EntityFramework.CachingProvider;
provider connection string="
wrappedProvider=System.Data.SqlClient;
Data Source=localhost;Initial Catalog=Northwind;user id= userid;
password=password;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient"/>
</connectionStrings>
Fügen Sie auch die Provider-Factory für die Initialisierung von hinzu NCache Entity Framework-Anbieter. Das unveränderliche Attribut sollte mit dem Anbieternamen in der Verbindungszeichenfolge identisch sein.
<DbProviderFactories>
<add name="EF Caching Data Provider"
invariant="Alachisoft.Integrations.EntityFramework.
CachingProvider"
description="Caching Provider Wrapper"
type="Alachisoft.NCache.Integrations.
EntityFramework.EFCachingProviderFactory,
Alachisoft.Integrations.EntityFramework.
CachingProvider,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=cff5926ed6a53769"/>
</DbProviderFactories>
Der unveränderliche Name des Anbieters wird auch in der Anwendungs- (oder Web-) Konfigurationsdatei angegeben:
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices,
EntityFramework.SqlServer" />
</providers>
</entityFramework>
Ändern Sie den unveränderlichen Namen in EFCachingProviderServices
und tippe auf Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, Alachisoft.Integrations.EntityFramework.CachingProvider
wie unten dargestellt:
<entityFramework>
<providers>
<provider invariantName="EFCachingProviderServices"
type="Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices,
Alachisoft.Integrations.EntityFramework.CachingProvider" />
</providers>
</entityFramework>
Fügen Sie einen Interceptor im Anbieterabschnitt in der Anwendungs- (oder Web-) Konfigurationsdatei hinzu:
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<interceptors>
<interceptor type="Alachisoft.NCache.Integrations.EntityFramework.Caching.EFCommandInterceptor,
Alachisoft.Integrations.EntityFramework.CachingProvider" />
</interceptors>
</entityFramework>
Die folgenden Informationen sollten in den App-Einstellungen von hinzugefügt werden app.config/web.config
:
<appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
Anmerkungen: Die App-ID für efcaching.ncconf sollte dieselbe sein wie in der Anwendung (app.config), andernfalls wird ein Fehler ausgegeben)
Neben der Angabe der Verbindungszeichenfolge in app.config/web.config kann die Verbindung auch beim Erstellen angegeben werden ObjectContext
or EntityConnection
. Beim programmgesteuerten Erstellen einer Verbindungszeichenfolge müssen die Wrapperinformationen in einer Verbindungszeichenfolge enthalten sein. So kann die Verbindungszeichenfolge erstellt und erstellt werden ObjectContext
or EntityConnection
initialisiert werden kann.
try
{
SqlConnectionStringBuilder sqlConnBuilder = new SqlConnectionStringBuilder();
sqlConnBuilder.DataSource = "localhost";
sqlConnBuilder.InitialCatalog = "EFTestDB";
sqlConnBuilder.IntegratedSecurity = true;
string conString = sqlConnBuilder.ToString();
EntityConnectionStringBuilder efConnBuilder = new EntityConnectionStringBuilder();
efConnBuilder.Provider = "EFCachingProvider";
efConnBuilder.ProviderConnectionString = @"wrappedProvider=System.Data.SqlClient;" + conString;
efConnBuilder.Metadata = "res:// /NorthwindCustomerModel.csdl|res:" + "// /NorthwindCustomerModel.ssdl|res:" +"// /NorthwindCustomerModel.msl;";
EntityConnection connection = new EntityConnection(efConnBuilder.ToString());
}
catch (Exception ex)
{
// handle exception
}
Neben der Angabe der Anbieterinvariante in app.config/web.config kann die Anbieterinvariante beim Initialisieren der Konfiguration (Klasse, die DbConfiguration erbt) angegeben werden. So kann die Provider-Invariante angegeben werden:
try
{
this.SetProviderServices("EFCachingProviderServices", EFCachingProviderServices.Instance);
}
catch (Exception ex)
{
// handle exception
}
Neben der Angabe des Datenbank-Interceptors in app.config/web.config kann der Datenbank-Interceptor beim Initialisieren der Konfiguration (Klasse, die DbConfiguration erbt) angegeben werden. So kann der Interceptor angegeben werden:
try
{
this.AddInterceptor(new EFCommandInterceptor());
}
catch (Exception ex)
{
// handle exception
}
Benutzer können jetzt auch Ergebnisse mithilfe der bereitgestellten Erweiterung zwischenspeichern IQueryable
.
Geben Sie den Namensraum an
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
Rufen Sie Cache-Methodenüberladungen jetzt ab IQueryable
Instanz
var students = from s in db.Students
select s;
students.Cache();
// results are not cached yet
foreach (Student student in students)
//results are cached when enumerator from query is iterated completely
{
//using student
}
Änderungen in "efcaching.ncconf" erforderlich.
Die Anbieterkonfiguration enthält Informationen zu Cache und Caching-Richtlinien. Nachfolgend sind die in efcaching.ncconf erforderlichen Änderungen aufgeführt.
<configuration>
<app-config app-id = "PersonNameApp" mode = "analysis|caching">
Der „Analyse“-Modus wird verwendet, um zu überwachen, wie oft jede Abfrage ausgeführt wird, und generiert dann einen Bericht. Der Bericht enthält den Abfragetext und die Anzahl der Anrufe für jede Abfrage. Dieser Bericht kann in benutzerdefinierten Richtlinien verwendet werden. In diesem Modus wird kein Caching durchgeführt.
<analysis-policy log-path = "" analysis-time = "1min" cache-enable-threshold = "1" default-expiration-type = "Sliding" default-expiration-time = "180sec" dbsyncdependency= "false"/>
Protokollpfad: Pfad, unter dem Analyseprotokolldateien generiert werden.
Standard = < Installationsverzeichnis > /log-files/efcaching-analyse-logs/
Für den „Caching“-Modus speichert der Wrapping-Anbieter die Ergebnisse aller angegebenen Abfragen zwischen. Beide Richtlinien haben ihre eigenen Spezifikationen. Immer wenn eine Aktualisierung (entweder UPDATE, INSERT oder DELETE) in einer entsprechenden Datenbank erkannt wird, macht der Anbieter betroffene Cache-Einträge ungültig, indem er alle zwischengespeicherten Abfragen entfernt, die von einer der aktualisierten Tabellen abhängig waren.
<cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">
Für benutzerdefinierte Richtlinien enthält es eine vom Benutzer konfigurierbare Liste von Abfragen, die mit ihren Ergebnissen zwischengespeichert werden sollten. Es werden nur die Abfrageergebnisse zwischengespeichert, für die das Caching aktiviert ist. Sie können für alle Abfragen eine benutzerdefinierte Caching-Richtlinie festlegen.
<!--sql-query = "SELECT [Extent1].[CustomerID] AS [CustomerID],= @param_0"-->
<query>
<cache-query query text="SELECT [Extent1].[OrderID] AS [OrderID], < @param_0"/>
<cache-policy vary-by-cache-param="param_0" expiration-type="Sliding"
enabled="True" expiration-time="180sec" dbsyncdependency="False"/>
</query>
Bei gespeicherten Prozeduren ist der Abfragetext der Name einer gespeicherten Prozedur, und es gibt keine Standardrichtlinien- oder Datenbanksynchronisierungsabhängigkeit. Der Benutzer kann das Ergebnis gespeicherter Prozeduren nur mit Ablauf zwischenspeichern, hier ist keine Datenbankabhängigkeit erforderlich.
Bei Zwischenspeicherung auf API-Ebene (unterstützt in Entity Framework 6.0 und 6.1) können Sie Abfragen mithilfe der im Namespace bereitgestellten Erweiterungsmethode zwischenspeichern
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
und Sie können die Caching-Richtlinie für das Caching auf API-Ebene in der Konfigurationsdatei im folgenden Tag bereitstellen:
<api-level-caching expiration-type="sliding|absolute" enable="True|False"
expiration-time="120sec" dbsyncdependency="True|False">