QueryOver的NHibernate二级缓存问题

Ped*_*tos 2 nhibernate fluent-nhibernate

当我使用Session.Get()时,我有二级缓存工作正常但是如果我在NH3.0中使用新的QueryOver API,缓存不会被命中.

这非常有效:

public TEntity Get(int id)
{
  return session.Get<TEntity>(id);
}
Run Code Online (Sandbox Code Playgroud)

这不会达到缓存:

public TEntity Get(Expression<Func<TEntity bool>> filter)
{
    var query = _session.QueryOver<TEntity>()
                .Where(filter);

    query.Cacheable();     
    return query.SingleOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用事务来确保正确使用二级缓存.

这是我的Session配置:

Session = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
                .Mappings(x => x.FluentMappings.AddFromAssemblyOf<Activity>())
                .Cache(c => c.UseSecondLevelCache()
                            .UseQueryCache()
                            .ProviderClass<NHibernate.Cache.HashtableCacheProvider>())
                .ExposeConfiguration(cfg => configuration = cfg)
                .BuildSessionFactory()
                .OpenSession();
Run Code Online (Sandbox Code Playgroud)

我正在为缓存使用设置我的实体:

public class CommentMap : ClassMap<Comment>
    {
        public CommentMap()
        {
            Cache.ReadWrite();

            Id(x => x.Id);
            Map(x => x.Message);
            References(x => x.Activity);
            References(x => x.User);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在QueryOver查询上调用Cacheable方法:

public TEntity Get(Expression<Func<TEntity, bool>> filter)
        {
            var query = _session.QueryOver<TEntity>()
                .Where(filter);

            query
                .Cacheable();

            return query.SingleOrDefault();
        }
Run Code Online (Sandbox Code Playgroud)

我必须遗漏一些东西,只是无法弄清楚是什么.

Die*_*hon 6

有几个相关问题:

  • Session.Load 从来没有命中数据库,所以它不是缓存工作的证明
  • 查询缓存与实体缓存分开启用
  • 查询缓存是显式的:您必须告诉NHibernate QueryOver使用该Cacheable()方法缓存它

此外,请确保您要缓存其查询的实体具有实体缓存.否则缓存会使事情变得更糟.

  • 最后,问题是什么?是你有query.Cacheable()后跟返回query.SingleOrDefault()(而不是查询= query.Cacheable())?或者你找到了其他的东西. (2认同)