Come configurare la memorizzazione nella cache di Entity Framework?

Memorizzazione nella cache con Entity Framework

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.

Modalità di integrazione

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

Sincronizzazione database

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.

Come integrare NCache con Entity Framework?

Prerequisiti:

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:

  • SSDL
  • File di configurazione dell'applicazione (o Web).

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)

Passaggi per abilitare NCache Caching

Passaggio 1: aggiungi riferimento

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:

Passaggio 2: configurazioni SSDL (per Entity Framework 3.5 e 4.0)

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:

[Codice esistente]

<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:

[Codice modificato]

<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">

Passaggio 3: configurazioni dell'applicazione (o Web).

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:

Entity Framework 3.5 e 4.0

  • 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>
    

Entity Framework 6.0

  • 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>

    Entity Framework 6.1

  • 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>
    
    1. ID app : Questo sarà l'identificatore per l'applicazione corrente. Questo ID verrà utilizzato per leggere la configurazione da efcaching.ncconf
    2. Livello di registrazione : Determina il livello di registrazione per l'applicazione. Il nostro provider registrerà eccezioni ed errori solo quando il livello è impostato su Errore. Quando il livello è impostato su Debug, verranno registrate sia le eccezioni/errori che altre informazioni dettagliate. Non verrà registrato nulla se il livello è impostato su sconto (predefinito). Percorso in cui verranno generati i file di registro: Default = /file-di-registro/log-efcaching/
    3. Per applicare le modifiche di cui sopra, l'applicazione deve essere riavviata dopo aver apportato queste modifiche

NOTA: App-id per efcaching.ncconf dovrebbe essere lo stesso dell'applicazione (app.config), altrimenti verrà visualizzato un errore)

Metodo alternativo

Entity Framework 3.5 o 4.0

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
  }

Entity Framework 6.0

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
}

Entity Framework 6.1

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
}

Tramite API (6.0 e 6.1)

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
    	}

Passaggio 4: efcaching.ncconf Configurazioni:

Modifiche richieste in "efcaching.ncconf".

  1. Efcaching.ncconf si trova nel seguente percorso: "Installeddirectory:/Programmi/NCache/config".
  2. 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">
  3. 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"/>
  4. Log-path: percorso in cui verranno generati i file di registro dell'analisi.
    Predefinito = < dir-installazione > /file-di-registro/log-di-analisi-efcaching/

  5. 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">  
  6. 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>
  7. 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.

  8. 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">
    
© Copyright Alachisoft 2002 - . Tutti i diritti riservati. NCache è un marchio registrato di Diyatech Corp.