当我使用Session.Get()时,我的二级缓存工作正常,但是如果我在NH3.0中使用新的QueryOver API,缓存就不会受到影响。
这非常有效:
public TEntity Get(int id)
{
return session.Get<TEntity>(id);
}
这不会触及缓存:
public TEntity Get(Expression<Func<TEntity bool>> filter)
{
var query = _session.QueryOver<TEntity>()
.Where(filter);
query.Cacheable();
return 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();
我正在为缓存使用设置实体:
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);
}
}
我在QueryOver查询中调用了Cacheable方法:
public TEntity Get(Expression<Func<TEntity, bool>> filter)
{
var query = _session.QueryOver<TEntity>()
.Where(filter);
query
.Cacheable();
return query.SingleOrDefault();
}
我一定是错过了什么,只是无法弄清楚是什么。
答案 0 :(得分:6)
有几个相关问题:
Session.Load
从不点击数据库,因此不能证明缓存有效QueryOver
方法缓存Cacheable()
此外,请确保对要缓存其查询的实体进行实体缓存。否则缓存会使事情变得更糟。