¿Cómo configurar el almacenamiento en caché de Entity Framework?

Almacenamiento en caché con Entity Framework

Entity Framework es un conjunto de tecnologías en ADO.NET que respaldan el desarrollo de aplicaciones de software orientadas a datos. Con Entity Framework, los desarrolladores pueden trabajar a un nivel más alto de abstracción cuando manejan datos y pueden crear y mantener aplicaciones orientadas a datos con menos código que en las aplicaciones tradicionales.

NCache introduce el proveedor de almacenamiento en caché que actúa entre Entity Framework y la fuente de datos. La principal razón detrás de la Proveedor de almacenamiento en caché EF es reducir los viajes de la base de datos (que ralentizan el rendimiento de la aplicación) y servir el resultado de la consulta desde la memoria caché. El proveedor actúa entre el marco de la entidad ADO.NET y la fuente de datos original. Por lo tanto, el proveedor de almacenamiento en caché se puede conectar sin cambiar/compilar el código actual.

Modos de integración

NCache El proveedor de almacenamiento en caché de Entity Framework funciona en dos modos. Puede estar en "Almacenamiento en caché" o en "ECONOMÉTRICOS". En el modo de almacenamiento en caché, puede almacenar en caché el conjunto de resultados de las consultas seleccionadas. El modo de análisis funciona en modo de transferencia y lo ayuda a encontrar las consultas que debe almacenar en caché al generar un informe que muestra qué consultas se llaman con qué frecuencia. Para obtener más ayuda sobre los modos de integración

Sincronización de base de datos

NCache El proveedor de Entity Framework también garantiza que los datos en caché estén siempre sincronizados con la base de datos. Por lo tanto NCache usa .NET SqlCacheDependeny que registra una consulta SQL con SQL Server, de modo que si cualquier fila del conjunto de datos representado por esta consulta cambia en la base de datos, SQL Server envía una notificación de evento a NCache. NCache luego elimina el conjunto de resultados correspondiente de la memoria caché.

Cómo integrar NCache con Entity Framework?

Requisitos previos:

1. Debe tener una aplicación Entity Framework. (también puede usar una aplicación de muestra para EFCaching de NCache aplicaciones de muestra de la siguiente ruta:
"Directorio instalado:/ProgramFiles/NCache/samples/clr20/EntityDataModelIntegrationDemo"

En cada aplicación de Entity Framework, el modelo de datos de entidad ADO.NET ya está agregado, lo que genera automáticamente dos archivos:

  • SSDL
  • Archivo de configuración de la aplicación (o web)

2. Microsoft Visual Studio 2010 para Entity Framework 3.5 y 4.0 y Microsoft Visual Studio 2012/2013 para Entity Framework 6.0 y 6.1

3. Herramienta de base de datos (por ejemplo, MS SQL SERVER 2008, ORACLE)

Pasos para habilitar NCache Almacenamiento en caché

Paso 1: Agregar referencia

Añada Alachisoft.Integrations.EntityFramework.CachingProvider referencia a su aplicación Entity Framework. Este archivo .dll se coloca en la siguiente ruta:
"DirectorioInstalado:/ProgramFiles/NCache/integración/MSEntityFramework"
Después de agregar la referencia, se requieren cambios en 3 archivos diferentes:

Paso 2: Configuraciones de SSDL (para Entity Framework 3.5 y 4.0)

En el archivo SSDL que se genera al agregar ADO.NET Entity Data Model en la aplicación Entity Framework, se requieren los siguientes cambios:

A continuación se muestran los cambios de muestra para una base de datos SQL 2008;

En SSDL, el nombre del proveedor se especifica en el atributo Proveedor del elemento como se muestra a continuación:

[Código existente]

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

Para inyectar nuestro NCache Entity Framework Provider, debemos anular los atributos resaltados anteriormente para conectar nuestro proveedor. En SSDL, ponemos el nombre del nuevo proveedor en el atributo Proveedor y concatenamos el proveedor anterior con nuestro token de manifiesto de proveedor en el ProveedorManifestToken campo, como se muestra a continuación:

[Código modificado]

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

Paso 3: Configuraciones de la aplicación (o web)

El archivo de configuración de la aplicación (o web) que se genera al agregar ADO.NET Entity Data Model en la aplicación Entity Framework, requiere los siguientes cambios:

Entity Framework 3.5 y 4.0

  • El nombre invariable del proveedor se especifica en la cadena de conexión de la aplicación o el archivo de configuración 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>
  • Cambiar el nombre del proveedor a NCache Entity Framework Provider y también agregue la información del envoltorio del proveedor en la cadena de conexión como se muestra a continuación:

    <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>
    
  • También agregue la fábrica de proveedores para la inicialización de NCache Proveedor del marco de la entidad. El atributo invariable debe ser el mismo que el nombre del proveedor en la cadena de conexión.

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

  • El nombre invariable del proveedor también se especifica en el archivo de configuración de la aplicación (o web):

    <entityFramework>
        <providers>
    		<provider invariantName="System.Data.SqlClient"
          type="System.Data.Entity.SqlServer.SqlProviderServices,
           EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
  • Cambiar el nombre invariable a EFCachingProviderServices y escriba a Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, Alachisoft.Integrations.EntityFramework.CachingProvider como se muestra a continuación:

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

    Entity Framework 6.1

  • Agregue un interceptor en la sección del proveedor en el archivo de configuración de la aplicación (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>
    
  • Se debe agregar la siguiente información en la configuración de la aplicación de app.config/web.config:

    <appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
    
    1. ID de la aplicación : Este será el identificador de la aplicación actual. Este ID se utilizará para leer la configuración de efcaching.ncconf
    2. Nivel de registro : determine el nivel de registro para la aplicación. Nuestro proveedor registrará excepciones y errores solo cuando el nivel esté establecido en Error. Cuando el nivel se establece en Depuración, se registrarán tanto las excepciones/errores como otra información detallada. No se registrará nada si el nivel se establece en DESC (por defecto). Ruta en la que se generarán los archivos de registro: Predeterminado = /archivos de registro/efcaching-logs/
    3. Para aplicar los cambios anteriores, la aplicación debe reiniciarse después de realizar estos cambios

NOTA: App-id para efcaching.ncconf debe ser el mismo que en la aplicación (app.config) de lo contrario, generará un error)

Método alternativo

Entity Framework 3.5 o 4.0

Además de especificar la cadena de conexión en app.config/web.config, la conexión también se puede especificar al crear ObjectContext or EntityConnection. Al crear una cadena de conexión mediante programación, la información del contenedor debe incluirse en una cadena de conexión. Así es como se puede crear la cadena de conexión y ObjectContext or EntityConnection se puede inicializar.

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

Además de especificar el proveedor invariable en app.config/web.config, el proveedor invariable se puede especificar al inicializar la configuración (la clase hereda DbConfiguration). Así es como se puede especificar el invariante del proveedor:

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

Entidad Framework 6.1

Además de especificar el interceptor de la base de datos en app.config/web.config, el interceptor de la base de datos se puede especificar al inicializar la configuración (la clase hereda DbConfiguration). Así es como se puede especificar el interceptor:

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

Mediante API (6.0 y 6.1)

El usuario ahora también puede almacenar en caché los resultados utilizando la extensión provista para IQueryable.

  • Especificar el espacio de nombres

    using Alachisoft.NCache.Integrations.EntityFramework.Caching;
  • Llame a las sobrecargas del método de caché ahora desde IQueryable ejemplo

    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
    	}

Paso 4: Configuraciones de efcaching.ncconf:

Se requieren cambios en "efcaching.ncconf".

  1. Efcaching.ncconf se coloca en la siguiente ruta: "Directorio de instalación:/Archivos de programa/NCache/config".
  2. La configuración del proveedor contiene información relacionada con la caché y la política de almacenamiento en caché. A continuación se muestran los cambios necesarios en efcaching.ncconf.

    <configuration>
          <app-config app-id = "PersonNameApp" mode = "analysis|caching">
  3. El modo "Análisis" se utiliza para monitorear la cantidad de veces que se ejecuta cada consulta y luego genera un informe. El informe contiene el texto de la consulta y el recuento de llamadas para cada consulta. Este informe se puede utilizar en la política personalizada. No se realiza almacenamiento en caché en este modo.

    <analysis-policy log-path = "" analysis-time = "1min" cache-enable-threshold = "1" default-expiration-type = "Sliding" default-expiration-time = "180sec" dbsyncdependency= "false"/>
  4. Log-path: Ruta en la que se generarán los archivos de registro de análisis.
    Predeterminado = < directorio de instalación > /archivos-de-registro/efcaching-analysis-logs/

  5. Para el modo "Almacenamiento en caché", el proveedor de envoltura almacenará en caché los resultados de todas las consultas especificadas. Ambas pólizas tienen sus propias especificaciones. Cada vez que se detecta una actualización (ya sea ACTUALIZAR, INSERTAR o ELIMINAR) en una base de datos respectiva, el proveedor invalida las entradas de caché afectadas al desalojar todas las consultas almacenadas en caché que dependían de cualquiera de las tablas actualizadas.

    <cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">  
  6. Para la política personalizada, incluye una lista configurable por el usuario de consultas que deben almacenarse en caché con sus resultados. Solo se almacenarán en caché los resultados de la consulta para los que esté habilitado el almacenamiento en caché. Puede especificar una política de almacenamiento en caché personalizada para todas las consultas.

    <!--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. En el caso de los procedimientos almacenados, el texto de la consulta será el nombre de un procedimiento almacenado y no habrá ninguna política predeterminada ni dependencia de sincronización de la base de datos. El usuario puede almacenar en caché el resultado de los procedimientos almacenados solo con vencimiento, aquí no se requiere dependencia de la base de datos.

  8. En el caso del almacenamiento en caché de nivel de API (compatible con Entity Framework 6.0 y 6.1), puede almacenar en caché la consulta mediante el método de extensión proporcionado en el espacio de nombres
    using Alachisoft.NCache.Integrations.EntityFramework.Caching;
    y puede proporcionar una política de almacenamiento en caché para el almacenamiento en caché de nivel API en el archivo de configuración en la siguiente etiqueta:

    <api-level-caching expiration-type="sliding|absolute" enable="True|False"
     expiration-time="120sec" dbsyncdependency="True|False">
    
© Copyright Alachisoft 2002 - Todos los derechos reservados. NCache es una marca registrada de Diyatech Corp.