Como configurar o cache do Entity Framework?

Cache com Entity Framework

O Entity Framework é um conjunto de tecnologias em ADO.NET que suportam o desenvolvimento de aplicativos de software orientados a dados. Com o Entity Framework, os desenvolvedores podem trabalhar em um nível mais alto de abstração quando lidam com dados e podem criar e manter aplicativos orientados a dados com menos código do que em aplicativos tradicionais.

NCache apresenta o provedor de cache que atua entre o Entity Framework e a fonte de dados. A principal razão por trás do Fornecedor EF Caching é reduzir as viagens ao banco de dados (que diminuem o desempenho do aplicativo) e fornecer o resultado da consulta do cache. O provedor atua entre a estrutura de entidade ADO.NET e a fonte de dados original. Portanto, o provedor de cache pode ser conectado sem alterar/compilar o código atual.

Modos de Integração

NCache O provedor de cache do Entity Framework funciona em dois modos. Pode ser em "Cache"ou em"Análise". No modo de cache, você pode armazenar em cache o conjunto de resultados de consultas selecionadas. O modo de análise funciona no modo de passagem e ajuda a encontrar as consultas que devem ser armazenadas em cache, gerando um relatório mostrando quais consultas estão sendo chamadas com que frequência. Para obter mais ajuda sobre os modos de integração

Sincronização de banco de dados

NCache O provedor do Entity Framework também garante que os dados em cache sejam sempre sincronizados com o banco de dados. Portanto NCache usa .NET SqlCacheDependeny que registra uma consulta SQL com o SQL Server, portanto, se alguma linha do conjunto de dados representado por essa consulta for alterada no banco de dados, o SQL Server lançará uma notificação de evento para NCache. NCache em seguida, remove o conjunto de resultados correspondente do cache.

Como integrar NCache com o Entity Framework?

Pré-requisitos:

1. Você deve ter um aplicativo Entity Framework. (você também pode usar o aplicativo de amostra para EFCaching de NCache aplicativos de amostra do seguinte caminho:
"Diretório instalado:/ProgramFiles/NCache/samples/clr20/EntityDataModelIntegrationDemo"

Em todos os aplicativos do Entity Framework, o ADO.NET Entity Data Model já é adicionado, o que gera automaticamente dois arquivos:

  • SSDL
  • Arquivo de configuração do aplicativo (ou web)

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

3. Ferramenta de banco de dados (por exemplo, MS SQL SERVER 2008, ORACLE)

Etapas para ativar NCache Cache

Etapa 1: adicionar referência

Adicionar Alachisoft.Integrations.EntityFramework.CachingProvider referência ao seu aplicativo Entity Framework. Este arquivo .dll é colocado no seguinte caminho:
"Diretório instalado:/ProgramFiles/NCache/integração/MSEntityFramework"
Após adicionar a referência, são necessárias alterações em 3 arquivos diferentes:

Etapa 2: configurações SSDL (para Entity Framework 3.5 e 4.0)

No arquivo SSDL que é gerado ao adicionar o ADO.NET Entity Data Model no aplicativo Entity Framework, são necessárias as seguintes alterações:

Abaixo estão as alterações de exemplo para um banco de dados SQL 2008;

No SSDL, o nome do provedor é especificado no atributo Provider do elemento como mostrado abaixo:

[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 injetar nosso NCache Entity Framework Provider, precisamos substituir os atributos destacados acima para plugar nosso provedor. No SSDL, colocamos o nome do novo provedor no atributo Provider e concatenamos o provedor anterior com nosso token de manifesto do provedor no ProvedorManifestToken campo, como mostrado abaixo:

[Código Alterado]

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

Etapa 3: configurações do aplicativo (ou da Web)

O arquivo de configuração do aplicativo (ou web) que é gerado ao adicionar o ADO.NET Entity Data Model no aplicativo Entity Framework requer as seguintes alterações:

Entity Framework 3.5 e 4.0

  • O nome invariável do provedor é especificado na string de conexão do aplicativo ou arquivo de configuração da 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>
  • Altere o nome do provedor para NCache Entity Framework Provider e também adicione as informações do wrapper do provedor na string de conexão, conforme mostrado abaixo:

    <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>
    
  • Adicione também a fábrica do provedor para inicialização do NCache Provedor do Entity Framework. O atributo invariável deve ser igual ao nome do provedor na cadeia de conexão.

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

Entidade Framework 6.0

  • O nome invariável do provedor também é especificado no arquivo de configuração do aplicativo (ou web):

    <entityFramework>
        <providers>
    		<provider invariantName="System.Data.SqlClient"
          type="System.Data.Entity.SqlServer.SqlProviderServices,
           EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
  • Altere o nome invariável para EFCachingProviderServices e digite para Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, Alachisoft.Integrations.EntityFramework.CachingProvider como mostrado abaixo:

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

    Entidade Framework 6.1

  • Adicione um interceptor na seção do provedor no arquivo de configuração do aplicativo (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>
    
  • As informações a seguir devem ser adicionadas em appSettings de app.config/web.config:

    <appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
    
    1. ID do aplicativo : Este será o identificador do aplicativo atual. Este ID será usado para ler a configuração do efcaching.ncconf
    2. Nível de registro : Determine o nível de log para o aplicativo. Nosso provedor registrará exceções e erros somente quando o nível estiver definido como erro. Quando o nível é definido como Depuração, as exceções/erros e outras informações detalhadas serão registradas. Nada será registrado se o nível estiver definido como Off (predefinição). Caminho no qual os arquivos de log serão gerados: Padrão = /log-files/efcaching-logs/
    3. Para aplicar as alterações acima, o aplicativo deve ser reiniciado após essas alterações serem feitas

NOTA: O ID do aplicativo para efcaching.ncconf deve ser o mesmo que no aplicativo (app.config), caso contrário, ocorrerá um erro)

Método alternativo

Entity Framework 3.5 ou 4.0

Além de especificar a string de conexão em app.config/web.config, a conexão também pode ser especificada ao criar ObjectContext or EntityConnection. Ao criar uma cadeia de conexão programaticamente, as informações do wrapper devem ser incluídas em uma cadeia de conexão. Aqui está como a string de conexão pode ser criada e ObjectContext or EntityConnection pode ser inicializado.

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
  }

Entidade Framework 6.0

Além de especificar a invariante do provedor em app.config/web.config, a invariante do provedor pode ser especificada ao inicializar a configuração (classe herdando DbConfiguration). Veja como a invariante do provedor pode ser especificada:

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

Estrutura da Entidade 6.1

Além de especificar o interceptor de banco de dados em app.config/web.config, o interceptor de banco de dados pode ser especificado ao inicializar a configuração (classe herdando DbConfiguration). Aqui está como o interceptor pode ser especificado:

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

Através da API (6.0 e 6.1)

O usuário agora também pode armazenar em cache os resultados usando a extensão fornecida para IQueryable.

  • Especifique o namespace

    using Alachisoft.NCache.Integrations.EntityFramework.Caching;
  • Chame sobrecargas de método de cache agora de IQueryable instância

    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
    	}

Etapa 4: Configurações do efcaching.ncconf:

Mudanças necessárias em "efcaching.ncconf".

  1. Efcaching.ncconf é colocado no seguinte caminho: "Installeddirectory:/Program Files/NCache/configuração".
  2. A configuração do provedor contém informações relacionadas à política de cache e cache. Abaixo estão as alterações necessárias no efcaching.ncconf.

    <configuration>
          <app-config app-id = "PersonNameApp" mode = "analysis|caching">
  3. O modo "Analysis" é usado para monitorar o número de vezes que cada consulta é executada e, em seguida, gera um relatório. O relatório contém o texto da consulta e a contagem de chamadas para cada consulta. Este relatório pode ser usado na política personalizada. Nenhum cache é feito neste 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: Caminho no qual os arquivos de log de análise serão gerados.
    Padrão = < diretório de instalação > /arquivos de log/efcaching-analysis-logs/

  5. Para o modo "Cache", o provedor de encapsulamento armazenará em cache os resultados de todas as consultas especificadas. Ambas as políticas têm suas próprias especificações. Sempre que uma atualização é detectada (ou UPDATE, INSERT ou DELETE) em um respectivo banco de dados, o provedor invalida as entradas de cache afetadas removendo todas as consultas em cache que dependiam de qualquer uma das tabelas atualizadas.

    <cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">  
  6. Para política personalizada, inclui uma lista configurável pelo usuário de consultas que devem ser armazenadas em cache com seus resultados. Somente os resultados da consulta serão armazenados em cache para os quais o armazenamento em cache estiver ativado. Você pode especificar a política de cache personalizada para todas as 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. No caso de procedimentos armazenados, o texto da consulta será o nome de um procedimento armazenado e não haverá política padrão ou dependência de sincronização de banco de dados. O usuário pode armazenar em cache o resultado de procedimentos armazenados apenas com expiração, nenhuma dependência de banco de dados é necessária aqui.

  8. No caso de cache de nível de API (suportado no Entity Framework 6.0 e 6.1), você pode armazenar em cache a consulta usando o método de extensão fornecido no namespace
    using Alachisoft.NCache.Integrations.EntityFramework.Caching;
    e você pode fornecer a política de cache para o cache de nível de API no arquivo de configuração na seguinte tag:

    <api-level-caching expiration-type="sliding|absolute" enable="True|False"
     expiration-time="120sec" dbsyncdependency="True|False">
    
© Copyright Alachisoft 2002 - . Todos os direitos reservados. NCache é uma marca registrada da Diyatech Corp.