【发布时间】:2011-10-14 12:10:28
【问题描述】:
当我使用 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();
}
我一定是错过了什么,只是想不通。
【问题讨论】:
-
请注意我之后的所有读者!该问题似乎已被编辑以反映正确的实现,这可能就是 Diegos 的答案被标记为正确的原因......
标签: nhibernate fluent-nhibernate