當我使用Session.Get()時,我的二級緩存工作完美,但是如果我在NH3.0中使用新的QueryOver API,緩存不會被擊中。使用QueryOver的NHibernate二級緩存問題
這完美的作品:
public TEntity Get(int id)
{
return session.Get<TEntity>(id);
}
這不命中cache:
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查詢可緩存方法:
public TEntity Get(Expression<Func<TEntity, bool>> filter)
{
var query = _session.QueryOver<TEntity>()
.Where(filter);
query
.Cacheable();
return query.SingleOrDefault();
}
我一定錯過了一些東西,只是無法弄清楚什麼。
請注意任何讀者!這個問題似乎已被編輯,以反映正確的實施,這就是爲什麼Diegos回答標記正確... – Konstantin