具有实体框架的缓存表

时间:2016-07-18 08:54:24

标签: entity-framework caching

我有一些几乎永远不会改变的数据表,因此每次我在db-context上运行查询时都不想调用数据库。在NHibernate中,有一个选项可以在mapper上执行此操作: Cache.ReadOnly();

它会在启动时将整个表读取到缓存中,每次要加载对象时都会延迟加载,它会从缓存的内存中获取数据。

我如何对Entity-Framework做同样的事情?

2 个答案:

答案 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));
    }

}