Entity Framework è un insieme di tecnologie in ADO.NET che supportano lo sviluppo di applicazioni software orientate ai dati. Con Entity Framework, gli sviluppatori possono lavorare a un livello di astrazione più elevato quando gestiscono i dati e possono creare e mantenere applicazioni orientate ai dati con meno codice rispetto alle applicazioni tradizionali.
NCache introduce il provider di memorizzazione nella cache che agisce tra Entity Framework e l'origine dati. Il motivo principale dietro il Provider di memorizzazione nella cache di EF consiste nel ridurre i viaggi del database (che rallentano le prestazioni dell'applicazione) e nel servire il risultato della query dalla cache. Il provider agisce tra il framework di entità ADO.NET e l'origine dati originale. Pertanto il provider di memorizzazione nella cache può essere collegato senza modificare/compilare il codice corrente.
NCache Il provider di Entity Framework Caching funziona in due modalità. Può essere in "Caching"o in"AnalisiModalità ". Nella modalità di memorizzazione nella cache è possibile memorizzare nella cache il set di risultati delle query selezionate. La modalità di analisi funziona in modalità pass-through e consente di trovare le query da memorizzare nella cache generando un rapporto che mostra quali query vengono chiamate con quale frequenza. Per ulteriore assistenza sulle modalità di integrazione
NCache Il provider di Entity Framework garantisce inoltre che i dati nella cache siano sempre sincronizzati con il database. Dunque NCache utilizza .NET SqlCacheDependeny che registra una query SQL con SQL Server, quindi se una riga nel set di dati rappresentato da questa query viene modificata nel database, SQL Server genera una notifica di evento a NCache. NCache quindi rimuove il set di risultati corrispondente dalla cache.
1. Dovresti avere un'applicazione Entity Framework. (puoi anche usare un'applicazione di esempio per EFCaching da NCache applicazioni di esempio dal seguente percorso:
"Cartella installata:/Programmi/NCache/samples/clr20/EntityDataModelIntegrationDemo"
In ogni applicazione Entity Framework è già aggiunto ADO.NET Entity Data Model che genera automaticamente due file:
2. Microsoft Visual Studio 2010 per Entity Framework 3.5 e 4.0 e Microsoft Visual Studio 2012/2013 per Entity Framework 6.0 e 6.1
3. Strumento database (es. MS SQL SERVER 2008, ORACLE)
Aggiungi Alachisoft.Integrations.EntityFramework.CachingProvider
riferimento all'applicazione Entity Framework. Questo file .dll viene posizionato nel percorso seguente:
"Directory installata:/Programmi/NCache/integrazione/MSEntityFramework"
Dopo aver aggiunto il riferimento, sono necessarie modifiche in 3 file diversi:
Nel file SSDL che viene generato aggiungendo ADO.NET Entity Data Model nell'applicazione Entity Framework, sono richieste le seguenti modifiche:
Di seguito sono riportate le modifiche di esempio per un database SQL 2008;
In SSDL, il nome del provider è specificato nell'attributo Provider del elemento come mostrato di seguito:
<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">
Per iniettare il nostro NCache Entity Framework Provider, dobbiamo sovrascrivere gli attributi sopra evidenziati per aggiungere il nostro provider. In SSDL, inseriamo il nome del nuovo provider nell'attributo Provider e concateniamo il provider precedente con il nostro token manifest del provider nel ProviderManifestToken campo, come mostrato di seguito:
<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">
Il file di configurazione dell'applicazione (o Web) che viene generato aggiungendo ADO.NET Entity Data Model nell'applicazione Entity Framework, richiede le seguenti modifiche:
Il nome invariante del provider è specificato nella stringa di connessione dell'applicazione o nel file di configurazione Web:
<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>
Cambia il nome del provider in NCache Entity Framework Provider e aggiungi anche le informazioni sul wrapper del provider nella stringa di connessione come mostrato di seguito:
<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>
Aggiungi anche la fabbrica del provider per l'inizializzazione di NCache Fornitore di Entity Framework. L'attributo invariante deve essere uguale al nome del provider nella stringa di connessione.
<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>
Il nome invariante del provider viene specificato anche nel file di configurazione dell'applicazione (o Web):
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices,
EntityFramework.SqlServer" />
</providers>
</entityFramework>
Cambia il nome invariante in EFCachingProviderServices
e digita a Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, Alachisoft.Integrations.EntityFramework.CachingProvider
come mostrato di seguito:
<entityFramework>
<providers>
<provider invariantName="EFCachingProviderServices"
type="Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices,
Alachisoft.Integrations.EntityFramework.CachingProvider" />
</providers>
</entityFramework>
Aggiungi un interceptor nella sezione del provider nel file di configurazione dell'applicazione (o web):
<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>
Le seguenti informazioni dovrebbero essere aggiunte in appSettings of app.config/web.config
:
<appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
NOTA: App-id per efcaching.ncconf dovrebbe essere lo stesso dell'applicazione (app.config), altrimenti verrà visualizzato un errore)
Oltre a specificare la stringa di connessione in app.config/web.config, la connessione può anche essere specificata durante la creazione ObjectContext
or EntityConnection
. Durante la creazione di una stringa di connessione a livello di codice, le informazioni sul wrapper devono essere incluse in una stringa di connessione. Ecco come è possibile creare la stringa di connessione e ObjectContext
or EntityConnection
può essere inizializzato.
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
}
Oltre a specificare l'invariante del provider in app.config/web.config, è possibile specificare l'invariante del provider durante l'inizializzazione della configurazione (classe che eredita DbConfiguration). Ecco come è possibile specificare l'invariante del provider:
try
{
this.SetProviderServices("EFCachingProviderServices", EFCachingProviderServices.Instance);
}
catch (Exception ex)
{
// handle exception
}
Oltre a specificare l'intercettore del database in app.config/web.config, è possibile specificare l'intercettore del database durante l'inizializzazione della configurazione (classe che eredita DbConfiguration). Ecco come è possibile specificare l'intercettore:
try
{
this.AddInterceptor(new EFCommandInterceptor());
}
catch (Exception ex)
{
// handle exception
}
L'utente ora può anche memorizzare nella cache i risultati utilizzando l'estensione fornita IQueryable
.
Specificare lo spazio dei nomi
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
Chiama ora gli overload del metodo della cache da IQueryable
esempio
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
}
Modifiche richieste in "efcaching.ncconf".
La configurazione del provider contiene informazioni relative alla cache e ai criteri di memorizzazione nella cache. Di seguito sono riportate le modifiche richieste in efcaching.ncconf.
<configuration>
<app-config app-id = "PersonNameApp" mode = "analysis|caching">
La modalità "Analisi" viene utilizzata per monitorare il numero di volte in cui ciascuna query viene eseguita e quindi genera un report. Il rapporto contiene il testo della query e il conteggio delle chiamate per ciascuna query. Questo rapporto può essere utilizzato nella politica personalizzata. In questa modalità non viene eseguita la memorizzazione nella cache.
<analysis-policy log-path = "" analysis-time = "1min" cache-enable-threshold = "1" default-expiration-type = "Sliding" default-expiration-time = "180sec" dbsyncdependency= "false"/>
Log-path: percorso in cui verranno generati i file di registro dell'analisi.
Predefinito = < dir-installazione > /file-di-registro/log-di-analisi-efcaching/
Per la modalità "Caching", il provider di wrapping memorizzerà nella cache i risultati di tutte le query specificate. Entrambe le politiche hanno le proprie specifiche. Ogni volta che viene rilevato un aggiornamento (UPDATE, INSERT o DELETE) in un rispettivo database, il provider invalida le voci della cache interessate eliminando tutte le query memorizzate nella cache che dipendevano da una qualsiasi delle tabelle aggiornate.
<cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">
Per i criteri personalizzati, include un elenco configurabile dall'utente di query che devono essere memorizzate nella cache con i relativi risultati. Solo i risultati della query verranno memorizzati nella cache per i quali è abilitata la memorizzazione nella cache. È possibile specificare criteri di memorizzazione nella cache personalizzati per tutte le query.
<!--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>
In caso di stored procedure, il testo della query sarà il nome di una stored procedure e non ci saranno criteri predefiniti o dipendenze di sincronizzazione del database. L'utente può memorizzare nella cache i risultati delle stored procedure solo con la scadenza, qui non è richiesta alcuna dipendenza dal database.
In caso di memorizzazione nella cache a livello di API (supportata in Entity Framework 6.0 e 6.1), è possibile memorizzare nella cache le query utilizzando il metodo di estensione fornito nello spazio dei nomi
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
e puoi fornire criteri di memorizzazione nella cache per la memorizzazione nella cache a livello di API nel file di configurazione nel seguente tag:
<api-level-caching expiration-type="sliding|absolute" enable="True|False"
expiration-time="120sec" dbsyncdependency="True|False">