我有一些数据表几乎不会改变,因此我不想在每次运行db-context查询时都调用数据库。在NHibernate中,mapper有一个选项可以这样做:
Cache.ReadOnly();它将在启动时将整个表读取到缓存中,每当您想加载类似于延迟加载的对象时,它将从缓存内存中获取数据。
我如何在Entity-Framework中实现同样的功能?
我有一些数据表几乎不会改变,因此我不想在每次运行db-context查询时都调用数据库。在NHibernate中,mapper有一个选项可以这样做:
Cache.ReadOnly();它将在启动时将整个表读取到缓存中,每当您想加载类似于延迟加载的对象时,它将从缓存内存中获取数据。
我如何在Entity-Framework中实现同样的功能?
//query is cached using the default settings
var c = db.Countries.Where(t => t.IsActive).FromCache();
虽然不完全符合您的要求,但如果您使用Repository
模式,可以封装这个逻辑。
另一种方法: 如果您只想使用内置工具,则可以使用Local属性。
示例:
db.Countries.Load(); // load to cache
var countriesFromEFCache = db.Countries.Local;
foreach (var county in countriesFromEFCache ) // There is not any db query here
{
...
}
.Single, .First, .Where
等方法不会缓存结果,除非您使用二级缓存。如果需要缓存结果,则需要在EF中实现二级缓存。EntityFramework.Cache可以为EF 6.1应用程序启用查询结果的缓存。我们需要通过配置缓存提供程序和事务处理程序来告诉EF使用缓存。public class Configuration : DbConfiguration
{
public Configuration()
{
var transactionHandler = new CacheTransactionHandler(new InMemoryCache());
AddInterceptor(transactionHandler);
var cachingPolicy = new CachingPolicy();
Loaded +=(sender, args) => args.ReplaceService<DbProviderServices>(
(s, _) => new CachingProviderServices(s, transactionHandler,
cachingPolicy));
}
}