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.
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
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é.
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:
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)
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:
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:
<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:
<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">
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:
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>
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>
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>
NOTA: App-id para efcaching.ncconf debe ser el mismo que en la aplicación (app.config) de lo contrario, generará un error)
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
}
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
}
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
}
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
}
Se requieren cambios en "efcaching.ncconf".
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">
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"/>
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/
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">
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>
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.
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">