我有一些几乎永远不会改变的数据表,因此每次我在db-context上运行查询时都不想调用数据库。在NHibernate中,有一个选项可以在mapper上执行此操作: Cache.ReadOnly();
它会在启动时将整个表读取到缓存中,每次要加载对象时都会延迟加载,它会从缓存的内存中获取数据。
我如何对Entity-Framework做同样的事情?
答案 0 :(得分:1)
您可以尝试使用Entity Framework Extended Library。 通过这个库你可以写这样的东西
//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
{
...
}
答案 1 :(得分:1)
使用
.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));
}
}