Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate二级缓存问题与QueryOver_Nhibernate_Fluent Nhibernate - Fatal编程技术网

NHibernate二级缓存问题与QueryOver

NHibernate二级缓存问题与QueryOver,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,当我使用Session.Get()时,我的二级缓存工作得非常好,但是如果我在NH3.0中使用新的QueryOver API,缓存不会被命中 这非常有效: public TEntity Get(int id) { return session.Get<TEntity>(id); } public TEntity Get(int-id) { 返回会话.Get(id); } 这不会命中缓存: public TEntity Get(Expression<Func<TEnt

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

这非常有效:

public TEntity Get(int id)
{
  return session.Get<TEntity>(id);
}
public TEntity Get(int-id)
{
返回会话.Get(id);
}
这不会命中缓存:

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

    query.Cacheable();     
    return query.SingleOrDefault();
}
public TEntity Get(表达式过滤器)
{
var query=\u session.QueryOver()
.其中(过滤器);
query.Cacheable();
返回query.SingleOrDefault();
}
我使用事务来确保正确使用二级缓存

以下是我的会话配置:

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();
Session=fluent.Configure()
.Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
.Mappings(x=>x.FluentMappings.AddFromAssemblyOf())
.Cache(c=>c.UseSecondLevelCache()
.UseQueryCache()
.ProviderClass())
.ExposeConfiguration(cfg=>configuration=cfg)
.BuildSessionFactory()
.OpenSession();
我正在设置缓存使用的实体:

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);
        }
    }
public-class-CommentMap:ClassMap
{
公共地图()
{
Cache.ReadWrite();
Id(x=>x.Id);
Map(x=>x.Message);
参考文献(x=>x.Activity);
参考文献(x=>x.User);
}
}
我正在对QueryOver查询调用可缓存方法:

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

            query
                .Cacheable();

            return query.SingleOrDefault();
        }
public TEntity Get(表达式过滤器)
{
var query=\u session.QueryOver()
.其中(过滤器);
查询
.Cacheable();
返回query.SingleOrDefault();
}

我肯定错过了什么,只是不知道是什么。

有几个相关问题:

  • Session.Load
    从不命中数据库,因此不能证明缓存工作正常
  • 查询缓存与实体缓存分开启用
  • 查询缓存是显式的:您必须告诉NHibernate使用
    Cacheable()
    方法缓存
    QueryOver

另外,请确保为要缓存其查询的实体提供实体缓存。否则缓存会让事情变得更糟。

我确实启用了查询和实体缓存,我正在QueryOver上调用Cacheable()方法。星期一我会对照代码检查你的清单,看看我是否遗漏了什么。谢谢。最后,出了什么问题?是不是在query.Cacheable()之后返回query.SingleOrDefault()(而不是执行query=query.Cacheable())?或者你发现了别的什么。给我之后的读者留言!这个问题似乎被编辑以反映正确的实现,这可能就是为什么Diegos的答案被标记为正确。。。