У меня кэш 2-го уровня работает отлично, когда я использую Session.Get (), однако, если я использую новый API QueryOver в NH3.0, кэш не попадет.
Это прекрасно работает:
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();
}
Я использую транзакции, чтобы убедиться, что кэш 2-го уровня используется правильно.
Вот моя конфигурация сеанса:
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);
}
}
Я вызываю метод Cacheable в моих запросах QueryOver:
public TEntity Get(Expression<Func<TEntity, bool>> filter)
{
var query = _session.QueryOver<TEntity>()
.Where(filter);
query
.Cacheable();
return query.SingleOrDefault();
}
Iдолжно быть, что-то упускает, просто не могу понять, что.