Configuring NCache Entity Framework Core Provider
This section focuses on configuration required to use NCache as second level cache in an Entity Framework application.
This requires serializing entities and specifying NCache specific configurations in DbContext of your EF applications.
NCache 4.9 SP1 onwards, NCache also provides the flexibility to resync cache if items are invalidated due to expiration or eviction. This keeps the data afresh in the cache, and reduces network trips to the database to fetch the expired items.
Serializing Entities
All entities of the database model need to be serialized in order to be stored in NCache, therefore they have to be marked as serializable.
[Serializable]
public partial class Customers
{
// Getters setters
}
Specifying Cache Configurations in DbContext
To configure NCache in Entity Framework applications, NCache provides
configurable cache properties which are specified in the DbContext. The
NCacheConfiguration
class allows specifying the properties and configuring the
logger for your application:
Important
It is advised to configure NCache in either the database context or the entry point of the application, else an exception is thrown, prompting that NCache initialization configuration has not been provided.
- The following code sample configures NCache for the EF application in an
extended
DbContext
class withSqlServer
DependencyType andCacheInitParams
specifying Cluster Port, Retry Interval and Connection Retries for the cache. The configurationsCacheId
andConnString
have been specified in App.config:
public partial class NorthwindContext : DbContext
{
...
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Parameters specified in App.config
string cacheId = ConfigurationManager.AppSettings["CacheId"];
string connString = ConfigurationManager.AppSettings["ConnString"];
// configure cache with SQLServer DependencyType and CacheInitParams
CacheInitParams initParams = new CacheInitParams();
initParams.RetryInterval = 3;
initParams.ConnectionRetries = 2;
initParams.Port = 7801;
NCacheConfiguration.Configure(cacheId, DependencyType.SQLServer, initParams);
optionsBuilder.UseSqlServer(connString);
}
}
Create and Deploy EF Core Resync Provider
NCache provides EFDefaultResyncProvider
which further implements IReadThruProvider
. This requires instantiating the DbContext which has been created in the previous step. Once the provider has been created, you need to deploy it as Read-Through Provider using NCache Manager.
public class EFDefaultProvider : EFDefaultResyncProvider
{
protected override DbContext InitializedDbContext()
{
return new NorthwindContext();
}
}
Deploy the provider using the steps explained in Administrators' Guide.
Default Schema Configuration for SQL Dependency
Database dependency queries differ slightly from regular SQL queries. Hence SQL
Server does not accept the query specified as valid. To avoid this issue, dbo
needs to be appended before the table name where default schema is set as dbo
.
This can be done by adding the following line of code in the OnModelCreating
method in DbContext
class:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("dbo"); //add this line for SQL dependency
//rest of the entity model code goes here
}
The query now generated can be used to configure database dependency.
Configuration Options
The configuration options provided by NCacheConfiguration
are:
Member | Type | Description |
---|---|---|
CacheId |
string |
Specifies the name of the cache to be used for serving in the Entity Framework application. If no cache name is specified, a configuration exception will be thrown. |
DatabaseType |
DependencyType |
Enum to inform the cache about the database being used by Entity Framework. The values are:Other = 0SqlServer = 1Oracle = 2This enum deals with data invalidation. If data is updated in the database, NCache removes the cached queries based on the affected entities so that new data can be served from the data source on the next query to prevent usage of stale data. NOTE: Entity Framework Core does not yet provide support for Oracle, so it should be avoided. NOTE: In case of DependencyType set as Other , database dependency is not created.NOTE: In case of DependencyType set as SqlServer , SQL service broker must be enabled on SQL server as data invalidation requires SQL dependency. SQL dependency also requires special configuration change to DbContext . See below for detail. |
InitParams |
CacheInitParams |
Class that contains customized parameters to initialize cache with user specified configurations. |
IsConfigured |
bool |
Specifies whether DbContext has been configured with any overriding options or not. |
Method | Description |
---|---|
Configure |
Configures the cache to be used for serving in the Entity Framework application. This sets the configuration of the cache according to the user specified properties. It takes in the cache ID, database dependency type and any optional initialization parameters for the cache. |
ConfigureLogger |
Configures instance(s) of Microsoft.Extensions.Logging.ILogger via an Microsoft.Extensions.Logging.ILoggerFactory in order to log details of operations from the caching provider. |
IsLoggerEnabled |
Specifies whether the logger has been enabled at the specified log level or not. |
See Also
Installing Entity Framework Core Caching Provider
Using NCache Entity Framework Core Caching Provider
Logging Entity Framework Core Caching Provider
NCache Memcached Plug-In and Gateway Support