Comment configurer la mise en cache d'Entity Framework ?

Mise en cache avec Entity Framework

Entity Framework est un ensemble de technologies dans ADO.NET qui prend en charge le développement d'applications logicielles orientées données. Avec Entity Framework, les développeurs peuvent travailler à un niveau d'abstraction plus élevé lorsqu'ils traitent des données, et peuvent créer et maintenir des applications orientées données avec moins de code que dans les applications traditionnelles.

NCache introduit le fournisseur de mise en cache qui agit entre Entity Framework et la source de données. La principale raison derrière la Fournisseur de mise en cache EF est de réduire les déplacements de la base de données (qui ralentissent les performances de l'application) et de servir le résultat de la requête à partir du cache. Le fournisseur agit entre l'infrastructure d'entité ADO.NET et la source de données d'origine. Par conséquent, le fournisseur de mise en cache peut être branché sans modifier/compiler le code actuel.

Modes d'intégration

NCache Le fournisseur Entity Framework Caching fonctionne sous deux modes. Il peut être soit en "Cache haute performance " ou dans " ". En mode mise en cache, vous pouvez mettre en cache l'ensemble des résultats des requêtes sélectionnées. Le mode d'analyse fonctionne en mode pass-through et vous aide à trouver les requêtes que vous devez mettre en cache en générant un rapport indiquant quelles requêtes sont appelées avec quelle fréquence. Pour plus d'aide sur les modes d'intégration

Synchronisation De La Base De Données

NCache Le fournisseur Entity Framework garantit également que les données en cache sont toujours synchronisées avec la base de données. Par conséquent NCache utilise .NET SqlCacheDependeny qui enregistre une requête SQL avec SQL Server, donc si une ligne de l'ensemble de données représenté par cette requête est modifiée dans la base de données, SQL Server envoie une notification d'événement à NCache. NCache puis supprime le jeu de résultats correspondant du cache.

Comment intégrer NCache avec Entity Framework ?

Pré-requis :

1. Vous devriez avoir une application Entity Framework. (vous pouvez également utiliser un exemple d'application pour EFCaching à partir de NCache exemples d'applications à partir du chemin suivant :
"Répertoire installé :/ProgramFiles/NCache/samples/clr20/EntityDataModelIntegrationDemo"

Dans chaque application Entity Framework, ADO.NET Entity Data Model est déjà ajouté, ce qui génère automatiquement deux fichiers :

  • SSDL
  • Fichier de configuration de l'application (ou web)

2. Microsoft Visual Studio 2010 pour Entity Framework 3.5 et 4.0 et Microsoft Visual Studio 2012/2013 pour Entity Framework 6.0 et 6.1

3. Outil de base de données (par exemple, MS SQL SERVER 2008, ORACLE)

Étapes pour activer NCache Cache haute performance

Étape 1 : Ajouter une référence

Ajouter Alachisoft.Integrations.EntityFramework.CachingProvider référence à votre application Entity Framework. Ce fichier .dll est placé sur le chemin suivant :
"Répertoire installé :/ProgramFiles/NCache/intégration/MSEntityFramework"
Après avoir ajouté la référence, des modifications sont nécessaires dans 3 fichiers différents :

Étape 2 : Configurations SSDL (pour Entity Framework 3.5 et 4.0)

Dans le fichier SSDL généré lors de l'ajout du modèle de données d'entité ADO.NET dans l'application Entity Framework, les modifications suivantes sont requises :

Vous trouverez ci-dessous les exemples de modifications pour une base de données SQL 2008 ;

Dans SSDL, le nom du fournisseur est spécifié dans l'attribut Fournisseur du élément comme indiqué ci-dessous :

[Code existant]

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

Afin d'injecter notre NCache Entity Framework Provider, nous devons remplacer les attributs mis en évidence ci-dessus pour brancher notre fournisseur. Dans SSDL, nous mettons le nom du nouveau fournisseur dans l'attribut Provider et concaténons le fournisseur précédent avec notre jeton de manifeste de fournisseur dans le ProviderManifestTokenProviderManifestToken champ, comme indiqué ci-dessous :

[Code modifié]

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

Étape 3 : Configurations d'application (ou Web)

Le fichier de configuration d'application (ou Web) généré lors de l'ajout du modèle de données d'entité ADO.NET dans l'application Entity Framework nécessite les modifications suivantes :

Cadre d'entité 3.5 et 4.0

  • Le nom de l'invariant du fournisseur est spécifié dans la chaîne de connexion de l'application ou du fichier de configuration 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>
  • Remplacez le nom du fournisseur par NCache Entity Framework Provider et ajoutez également les informations du wrapper du fournisseur dans la chaîne de connexion, comme indiqué ci-dessous :

    <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>
    
  • Ajoutez également la fabrique de fournisseurs pour l'initialisation de NCache Fournisseur de structure d'entité. L'attribut invariant doit être identique au nom du fournisseur dans la chaîne de connexion.

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

  • Le nom de l'invariant du fournisseur est également spécifié dans le fichier de configuration de l'application (ou Web) :

    <entityFramework>
        <providers>
    		<provider invariantName="System.Data.SqlClient"
          type="System.Data.Entity.SqlServer.SqlProviderServices,
           EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
  • Changer le nom de l'invariant en EFCachingProviderServices et tapez à Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, Alachisoft.Integrations.EntityFramework.CachingProvider comme indiqué ci-dessous:

  • <entityFramework>
        <providers>
            <provider invariantName="EFCachingProviderServices" 
            type="Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices,
             Alachisoft.Integrations.EntityFramework.CachingProvider" />
        </providers>
    </entityFramework>

    Entity Framework 6.1

  • Ajoutez un intercepteur dans la section provider du fichier de configuration de l'application (ou 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>
    
  • Les informations suivantes doivent être ajoutées dans appSettings de app.config/web.config:

    <appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
    
    1. ID d'application : Ce sera l'identifiant de l'application en cours. Cet ID sera utilisé pour lire la configuration de efcaching.ncconf
    2. Niveau journalisation : déterminer le niveau de journalisation pour l'application. Notre fournisseur enregistrera les exceptions et les erreurs uniquement lorsque le niveau est défini sur Erreur. Lorsque le niveau est défini sur Débogage, les exceptions/erreurs et d'autres informations détaillées seront enregistrées. Rien ne sera enregistré si le niveau est défini sur de (défaut). Chemin sur lequel les fichiers journaux seront générés : Par défaut = /fichiers-journaux/efcaching-logs/
    3. Pour appliquer les modifications ci-dessus, l'application doit être redémarrée une fois ces modifications apportées

REMARQUE: L'ID d'application pour efcaching.ncconf doit être identique à celui de l'application (app.config), sinon une erreur s'affichera)

Méthode alternative

Entity Framework 3.5 ou 4.0

Outre la spécification de la chaîne de connexion dans app.config/web.config, la connexion peut également être spécifiée lors de la création ObjectContext or EntityConnection. Lors de la création d'une chaîne de connexion par programme, les informations de wrapper doivent être incluses dans une chaîne de connexion. Voici comment la chaîne de connexion peut être créée et ObjectContext or EntityConnection peut être initialisé.

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

Outre la spécification de l'invariant du fournisseur dans app.config/web.config, l'invariant du fournisseur peut être spécifié lors de l'initialisation de la configuration (classe héritant de DbConfiguration). Voici comment l'invariant de fournisseur peut être spécifié :

try
{
    this.SetProviderServices("EFCachingProviderServices", EFCachingProviderServices.Instance);
}
catch (Exception ex)
{ 
    // handle exception
}

Cadre d'entité 6.1

Outre la spécification de l'intercepteur de base de données dans app.config/web.config, l'intercepteur de base de données peut être spécifié lors de l'initialisation de la configuration (classe héritant de DbConfiguration). Voici comment l'intercepteur peut être spécifié :

try
{
    this.AddInterceptor(new EFCommandInterceptor());
}
catch (Exception ex)
{ 
    // handle exception
}

Via API (6.0 et 6.1)

L'utilisateur peut désormais également mettre en cache les résultats à l'aide de l'extension fournie pour IQueryable.

  • Spécifiez l'espace de noms

    using Alachisoft.NCache.Integrations.EntityFramework.Caching;
  • Appelez les surcharges de méthode de cache maintenant à partir de IQueryable instance

    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
    	}

Étape 4 : Configurations efcaching.ncconf :

Modifications requises dans "efcaching.ncconf".

  1. Efcaching.ncconf est placé sur le chemin suivant : "Installeddirectory:/Program Files/NCache/config".
  2. La configuration du fournisseur contient des informations relatives au cache et à la stratégie de mise en cache. Vous trouverez ci-dessous les modifications requises dans efcaching.ncconf.

    <configuration>
          <app-config app-id = "PersonNameApp" mode = "analysis|caching">
  3. Le mode "Analyse" est utilisé pour surveiller le nombre d'exécutions de chaque requête, puis il génère un rapport. Le rapport contient le texte de la requête et le nombre d'appels pour chaque requête. Ce rapport peut être utilisé dans la stratégie personnalisée. Aucune mise en cache n'est effectuée dans ce mode.

    <analysis-policy log-path = "" analysis-time = "1min" cache-enable-threshold = "1" default-expiration-type = "Sliding" default-expiration-time = "180sec" dbsyncdependency= "false"/>
  4. Log-path : chemin sur lequel les fichiers journaux d'analyse seront générés.
    Par défaut = < rép_installation > /fichiers-journaux/efcaching-analysis-logs/

  5. Pour le mode "Caching", le fournisseur d'encapsulation mettra en cache les résultats de toutes les requêtes spécifiées. Les deux politiques ont leurs propres spécifications. Chaque fois qu'une mise à jour est détectée (soit UPDATE, INSERT ou DELETE) dans une base de données respective, le fournisseur invalide les entrées de cache concernées en supprimant toutes les requêtes mises en cache qui dépendaient de l'une des tables mises à jour.

    <cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">  
  6. Pour la stratégie personnalisée, il inclut une liste configurable par l'utilisateur des requêtes qui doivent être mises en cache avec leurs résultats. Seuls les résultats de la requête seront mis en cache pour lesquels la mise en cache est activée. Vous pouvez spécifier une stratégie de mise en cache personnalisée pour toutes les requêtes.

    <!--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. Dans le cas de procédures stockées, le texte de la requête sera le nom d'une procédure stockée et il n'y aura pas de stratégie par défaut ou de dépendance de synchronisation de base de données. L'utilisateur peut mettre en cache le résultat des procédures stockées avec expiration uniquement, aucune dépendance à la base de données n'est requise ici.

  8. En cas de mise en cache au niveau de l'API (prise en charge dans Entity Framework 6.0 et 6.1), vous pouvez mettre en cache la requête à l'aide de la méthode d'extension fournie dans l'espace de noms.
    using Alachisoft.NCache.Integrations.EntityFramework.Caching;
    et vous pouvez fournir une politique de mise en cache pour la mise en cache au niveau de l'API dans le fichier de configuration dans la balise suivante :

    <api-level-caching expiration-type="sliding|absolute" enable="True|False"
     expiration-time="120sec" dbsyncdependency="True|False">
    
© Copyright Alachisoft 2002 - . Tous droits réservés. NCache est une marque déposée de Diyatech Corp.