Статьи

Как настроить кэширование Entity Framework

Распределенное кеширование с помощью Entity Framework

Entity Framework — это набор технологий в ADO.NET, которые поддерживают разработку программных приложений, ориентированных на данные. С Entity Framework разработчики могут работать на более высоком уровне абстракции, когда имеют дело с данными, и могут создавать и поддерживать ориентированные на данные приложения с меньшим количеством кода, чем в традиционных приложениях.

NCache представляет поставщика кэширования, который действует между Entity Framework и источником данных. Основная причина, лежащая в основе поставщика EF Caching, заключается в том, чтобы уменьшить количество обращений к базе данных (что снижает производительность приложений) и обслуживать результат запроса из кэша. Поставщик действует между структурой сущности ADO.NET и исходным источником данных. Следовательно, поставщик кэширования может быть подключен без изменения / компиляции текущего кода.


Вам также может понравиться:
Entity Framework (EF) Core Cache

Режимы интеграции

Поставщик кэширования NCache Entity Framework работает в двух режимах. Это может быть либо в режиме « Кэширование », либо в режиме « Анализ ». В режиме кэширования вы можете кэшировать набор результатов выбранных запросов. Режим анализа работает в сквозном режиме и помогает вам находить запросы, которые следует кэшировать, создавая отчет, показывающий, какие запросы вызываются с какой периодичностью.

Синхронизация базы данных

Поставщик NCache Entity Framework также гарантирует, что данные в кэше всегда синхронизируются с базой данных. Поэтому NCache использует .NET SqlCacheDependeny, который регистрирует запрос SQL на SQL Server, поэтому, если в базе данных изменяется какая-либо строка в наборе данных, представленном этим запросом, SQL Server отправляет уведомление о событии в NCache. Затем NCache удаляет соответствующий набор результатов из кэша.

Как интегрировать NCache с Entity Framework

Предпосылки

1. У вас должно быть приложение Entity Framework. (Вы также можете использовать пример приложения для EFCaching из примеров приложений NCache по следующему пути:
«Installeddirectory: / ProgramFiles / NCache / samples / clr20 / EntityDataModelIntegrationDemo»)

В каждое приложение Entity Framework уже добавлена ​​модель данных объекта ADO.NET, которая автоматически создает два файла:

  • SSDL
  • Файл конфигурации приложения (или сети)

2. Microsoft Visual Studio 2010 для Entity Framework 3.5 и 4.0 и Microsoft Visual Studio 2012/2013 для Entity Framework 6.0 и 6.1

3. Инструмент базы данных (например, MS SQL SERVER 2008, ORACLE)

Шаги для включения кэширования NCache

Шаг 1: Добавить ссылку

Добавьте Alachisoft.Integrations.EntityFramework.CachingProviderссылку на ваше приложение Entity Framework. Этот файл .dll находится по следующему пути:
« Installeddirectory: / ProgramFiles / NCache / интеграции / MSEntityFramework »
После добавления ссылки, изменения необходимы в 3 разных файлах.

Шаг 2. Конфигурации SSDL (для Entity Framework 3.5 и 4.0)

В файле SSDL, который создается при добавлении ADO.NET Entity Data Model в приложение Entity Framework, необходимы следующие изменения:

Ниже приведены примеры изменений для базы данных SQL 2008.

В SSDL имя поставщика указывается в атрибуте Provider элемента <Schema />, как показано ниже:

[Существующий код]

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

Чтобы внедрить нашего провайдера NCache Entity Framework, нам нужно переопределить вышеуказанные атрибуты, чтобы подключить нашего провайдера. В SSDL мы указываем имя нового поставщика в атрибуте Provider и объединяем предыдущего поставщика с токеном манифеста нашего поставщика в поле ProviderManifestToken , как показано ниже:

[Измененный код]

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

Шаг 3. Конфигурации приложений (или веб-сайтов)

Файл конфигурации приложения (или веб-приложения), который создается при добавлении модели данных Entity ADO.NET в приложение Entity Framework, требует следующих изменений:

Entity Framework 3.5 и 4.0

  • Имя инварианта провайдера указывается в строке подключения приложения или файла веб-конфигурации:
    <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>
  • Измените имя поставщика на NCache Entity Framework Provider, а также добавьте информацию об оболочке поставщика в строку подключения, как показано ниже:
    <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>
  • Также добавьте фабрику провайдеров для инициализации NCache Entity Framework Provider. Атрибут invariant должен совпадать с именем поставщика в строке подключения.
  • <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

  • Имя инварианта провайдера также указывается в файле конфигурации приложения (или сети):
    <entityFramework>
        <providers>
    <provider invariantName="System.Data.SqlClient"
          type="System.Data.Entity.SqlServer.SqlProviderServices,
           EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
  • Измените имя инварианта на EFCachingProviderServicesи введите Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, 
    Alachisoft.Integrations.EntityFramework.CachingProviderкак показано ниже:
  • <entityFramework>
        <providers>
            <provider invariantName="EFCachingProviderServices" 
            type="Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices,
             Alachisoft.Integrations.EntityFramework.CachingProvider" />
        </providers>
    </entityFramework>

    Entity Framework 6.1

  • Добавьте перехватчик в разделе провайдера в файле конфигурации приложения (или веб-сайта):
    <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>
  • Следующая информация должна быть добавлена ​​в appSettings of app.config/web.config:
    <appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
    1. App-id : это будет идентификатор текущего приложения. Этот идентификатор будет использоваться для чтения конфигураций из efcaching.ncconf
    2. Уровень ведения журнала. Определите уровень ведения журнала для приложения. Наш провайдер будет регистрировать исключения и ошибки только в том случае, если для уровня установлено значение Ошибка . Когда уровень установлен на Debug, будут регистрироваться как исключения / ошибки, так и другая подробная информация. Ничего не будет зарегистрировано, если уровень установлен на Off (по умолчанию). Путь, по которому будут создаваться файлы журналов: По умолчанию = <install-dir> <install-dir> / log-files / efcaching-logs /
    3. Для применения вышеуказанных изменений, приложение должно быть перезапущено после внесения этих изменений

ПРИМЕЧАНИЕ. Идентификатор приложения для efcaching.ncconf должен быть таким же, как и в приложении (app.config), в противном случае появится сообщение об ошибке)

Альтернативный метод

Entity Framework 3.5 или 4.0

Помимо указания строки подключения в app.config / web.config, подключение также можно указать при создании ObjectContextили EntityConnection. При программном создании строки подключения информация об оболочке должна быть включена в строку подключения. Вот как строка соединения может быть создана и / ObjectContextили EntityConnectionможет быть инициализирована.

  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

Помимо указания инварианта провайдера в app.config / web.config, инвариант провайдера может быть указан при инициализации конфигурации (класс, наследующий DbConfiguration). Вот как можно указать инвариант провайдера:

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

Entity Framework 6.1

Помимо указания перехватчика базы данных в app.config / web.config, перехватчик базы данных может быть указан при инициализации конфигурации (класс, наследующий DbConfiguration). Вот как можно указать перехватчик:

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

Через API (6.0 и 6.1)

Теперь пользователь также может кэшировать результаты, используя расширение, предусмотренное для IQueryable.

  • Укажите пространство имен
  •  using Alachisoft.NCache.Integrations.EntityFramework.Caching;
  • Метод кеша вызовов теперь перегружается из IQueryableэкземпляра
 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
}

Шаг 4: Конфигурации efcaching.ncconf

Требуются изменения в «efcaching.ncconf».

  1. Efcaching.ncconf находится по следующему пути: «Установленный каталог: / Program Files / NCache / config».
  2. Конфигурация провайдера содержит информацию о кеше и политике кэширования. Ниже приведены необходимые изменения в файле efcaching.ncconf.
    <configuration>
          <app-config app-id = "PersonNameApp" mode = "analysis|caching">
  3. Режим «Анализ» используется для мониторинга количества выполнений каждого запроса, а затем генерирует отчет. Отчет содержит текст запроса и количество вызовов для каждого запроса. Этот отчет может быть использован в пользовательской политике. В этом режиме кэширование не выполняется.
    <analysis-policy log-path = "" analysis-time = "1min" cache-enable-threshold = "1" default-expiration-type = "Sliding" default-expiration-time = "180sec" dbsyncdependency= "false"/>
  4. Log-path: путь, по которому будут сгенерированы файлы журнала анализа. По умолчанию = <install-dir> / log-files / efcaching-analysis-logs /
  5. В режиме «Кэширование» поставщик упаковки будет кэшировать результаты всех указанных запросов. Обе политики имеют свои собственные спецификации. Всякий раз, когда в соответствующей базе данных обнаруживается обновление (либо UPDATE, INSERT, либо DELETE), провайдер делает недействительными записи в кэше, на которые влияют, путем удаления всех кэшированных запросов, которые зависели от любой из обновленных таблиц.
    <cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">
  6. Для настраиваемой политики он включает настраиваемый пользователем список запросов, которые должны кэшироваться вместе с их результатами. Будут кэшироваться только те результаты запроса, для которых включено кэширование. Вы можете указать собственную политику кэширования для всех запросов.
    <!--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. В случае хранимых процедур, текст запроса будет именем хранимой процедуры, и не будет никакой политики по умолчанию или зависимости синхронизации базы данных. Пользователь может кэшировать результат хранимых процедур только с истечением срока действия, здесь не требуется никакой зависимости от базы данных.
  8.  В случае кэширования на уровне API (поддерживается в Entity Framework 6.0 и 6.1) вы можете кэшировать запрос, используя метод расширения, предоставленный в пространстве имен, using Alachisoft.NCache.Integrations.EntityFramework.Caching;
    и вы можете предоставить политику кэширования для кэширования на уровне API в файле конфигурации в следующем теге:
    <api-level-caching expiration-type="sliding|absolute" enable="True|False"
     expiration-time="120sec" dbsyncdependency="True|False">

Дальнейшее чтение

Использование .NET Caching в EF Core с помощью методов расширения [Видео]

Hibernate: история кэширования