使用Entity Framework缓存表

3

我有一些数据表几乎不会改变,因此我不想在每次运行db-context查询时都调用数据库。在NHibernate中,mapper有一个选项可以这样做:

Cache.ReadOnly();

它将在启动时将整个表读取到缓存中,每当您想加载类似于延迟加载的对象时,它将从缓存内存中获取数据。

我如何在Entity-Framework中实现同样的功能?


你是使用哪个版本的Entity Framework? - Eldho
2个回答

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
{
  ...
}

嗨,厉害了 :) 感谢您的回复。但这不是我想要的。 它将缓存查询结果,并且您必须在使用每个查询时编写“.FromCache()”。 难道没有内置的东西来完成这个简单的任务吗? - Ashkan S
不幸的是,EF只有一级缓存,如果你想要更通用的方法,那么可以看看https://efcache.codeplex.com/。 - Ilya Sulimanov
@AshkanSirous请检查我的更新,也许会有帮助。 - Ilya Sulimanov

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接