Using NCache as Entity Framework (EF) Second Level Cache
Note
This feature is only available in NCache Enterprise Edition.
NCache custom Entity Framework ADO.NET provider can be integrated in the application without any code change. Simply modify configuration files and specify NCache Entity Framework Caching Provider as second Level Cache provider.
Prerequisites
Any Entity Framework application. The sample application for Entity Framework Caching from NCache sample applications can also be used from the following path:
%NCHOME%/samples/dotnet/EntityFramework
.Microsoft Visual Studio 2010 for Entity Framework 3.5 and 4.0 and Microsoft Visual Studio 2012-2013 for Entity Framework 6.1 and 6.2.
Database Tool (e.g. MS SQL SERVER, ORACLE)
Steps required to enable NCache as Second Level Cache Provider in Entity Framework application are as follows:
Reference Assembly
To utilize the Provider, include the following namespace in your application:
Alachisoft.Integrations.EntityFramework.CachingProvider
found in
%NCHOME%/integration/MSEntityFramework
.
Modifying Application or Web Configurations
App.config or Web.config which is generated on adding ADO.NET Entity Data Model in Entity Framework application, requires following changes:
Specify Provider Invariant Name
Provider invariant name is specified in the connection string of application or web configuration file:
Entity Framework 3.5-4.0
<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>
- Add the provider factory for initialization of NCache Entity Framework Provider. The invariant attribute should be the same as the provider name in connection string.
<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=x.x.x.x,Culture=neutral, PublicKeyToken=cff5926ed6a53769"/>
</DbProviderFactories>
Note
Replace Version=x.x.x.x with the actual NCache version that you have installed.
Alternative Method
Another method for specifying connection is specifying the connection while creating ObjectContext
or EntityConnection
. The example below shows the creation of a connection string programmatically and initialization of 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.1 and 6.2
Overwrite the invariantName
and type
configurations to specify NCache Entity Framework Provider as shown below. Add an interceptor in <provider>
section in the application (or web) configuration file:
<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>
Alternative Method
The provider variant can also be specified while initializing the configuration. Given below is the example showing how provider invariant can be specified.
try
{
this.AddInterceptor(new EFCommandInterceptor());
}
catch (Exception ex)
{
// handle exception
}
You can now cache results using extension provided for IQueryable
. Follow the steps below:
- Specify the following namespace:
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
- Call the
Cache
method overloads now from IQueryable instance.
IQueryable<Course> courses;
//courses = <some query according to your requirement>
var courses = courses.Cache();
Add Application ID to appSettings
The following information should be added in <appSettings>
of App.config
or Web.config.
Note
These settings are independent of Entity Framework version.
<appSettings>
<add key="app-id" value="EFCachingDemo"/>
<add key="logging-level" value="Debug"/>
</appSettings>
app-id:
This will be the identifier for current application. This ID will be used to read configuration from efcaching.ncconf. NCache Entity Framework Caching provider reads the required information from efcaching.ncconf on the basis of ID given in App.config or Web.config file of your application.logging-level:
Determines the logging level for application. The provider will log exceptions and errors only when level is set to Error. When the level is set to Debug, both exceptions/errors and other detailed information will be logged. Nothing will be logged if the level is set to Off (default). Path at which log files will be generated is%NCHOME%/log-files/efcaching-logs
(Windows) oropt\ncache\log-files\efcaching-logs
(Linux).`
Note
App-id
of efcaching.ncconf should be the same as in application
(App.config) in order to avoid an error. Application should be restarted
after above changes are made.
Alternative method through Programming
Apart from specifying connection string in App.config or Web.config, the
connection can also be specified while creating ObjectContext
or
EntityConnection
. While creating a connection string programmatically, the
wrapper information must be included in a connection string. Here is how the
connection string can be created and ObjectContext
or EntityConnection
can
be initialized.
try
{
var sqlConnBuilder = new SqlConnectionStringBuilder();
sqlConnBuilder.DataSource = "localhost";
sqlConnBuilder.InitialCatalog = "EFTestDB";
sqlConnBuilder.IntegratedSecurity = true;
string conString = sqlConnBuilder.ToString();
var efConnBuilder = new EntityConnectionStringBuilder();
efConnBuilder.Provider = "EFCachingProvider";
efConnBuilder.ProviderConnectionString = @"wrappedProvider=System.Data.SqlClient;" + conString;
efConnBuilder.Metadata = "res:// /NorthwindCustomerModel.csdl|res:" + "// /NorthwindCustomerModel.ssdl|res:" +"// /NorthwindCustomerModel.msl;";
var connection = new EntityConnection(efConnBuilder.ToString());
}
catch (Exception ex)
{
// handle exception
}
Note
The application will need to be rebuilt for effectively applying the above changes.
See Also
Entity Framework Caching Config File
NHibernate
Entity Framework Core Caching