Свободное кэширование 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()
, если хотите.