Свободное кэширование NHibernate с автопилотом

Я пытаюсь понять, как настроить Fluent NHibernate для включения кэширования 2-го уровня для запросов, сущностей и т.д.... и в то же время использовать автоматизацию. В Интернете очень мало информации о том, как это сделать. Конечно, это можно сделать при сопоставлении классов один за другим... Но как насчет автоматов?

Вот мой код конфигурации:

AutoPersistenceModel model = AutoMap.AssemblyOf<Seminar>()
.Where(t => t.Namespace == "[MY NAMESPACE]")
.Conventions.Add(DefaultCascade.All());

Configuration config = Fluently.Configure()
.Database
(
    MsSqlConfiguration.MsSql2005
    .ConnectionString(@"[MY CONNECTION STRING]")
)
.Mappings(m => m.AutoMappings.Add(model))
.BuildConfiguration();

_sessionFactory = config.BuildSessionFactory();

Спасибо!

Ответ 1

Предполагая, что вы уже загрузили поставщика кэша второго уровня из проекта NHibernate Contribution, вы должны использовать следующее, чтобы инициализировать кеш в настройке автозагрузки.

Configuration config = Fluently.Configure()
.Database
(
    MsSqlConfiguration.MsSql2005
    .ConnectionString(@"[MY CONNECTION STRING]")
    .Cache(c => c.UseQueryCache().ProviderClass<YourCacheProviderOfChoice>())
)
.Mappings(m => m.AutoMappings.Add(model))
.BuildConfiguration();

Выбор запросов, которые вы хотите кэшировать, - это просто вызов SetCacheable (true) в вашем экземпляре Criteria.

 var query = session.CreateQuery("from Blog b where b.Author = :author")
    .SetString("author", "Gabriel")
    .SetCacheable(true);
 var list = query.List<Blog>();

Это эпическое сообщение в блоге в кэшах первого и второго уровней NHibernate, хороший справочный материал.

Ответ 2

Я боролся с этим некоторое время и был удивлен, как мало информации там. Этот вопрос - лучшее, что я мог найти, и даже здесь принятый ответ не говорит, как включить кэширование объектов. Вот что я узнал.

Чтобы включить кеш второго уровня:

Fluently.Configure()
    .Database(/* your DB config */)
    .Cache(c => c.UseSecondLevelCache().ProviderClass<CacheProviderClass>())

Вы можете использовать как этот, так и кеш-запрос:

Fluently.Configure()
    .Database(/* your DB config */)
    .Cache(c => c.UseSecondLevelCache()
        .UseQueryCache()
        .ProviderClass<CacheProviderClass>())

Чтобы включить кеширование для каждого объекта:

.Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Entity>()
              .Conventions.Add(ConventionBuilder.Class.Always(c => c.Cache.ReadWrite()))
          )
)

Конечно, вы можете использовать ReadOnly() или NonStrictReadWrite(), если хотите.