流畅的NHibernate缓存与自动化

md1*_*337 11 nhibernate fluent-nhibernate

我试图了解如何配置Fluent NHibernate以启用查询,实体等的二级缓存......同时使用自动化.关于如何做到这一点的网上信息非常少.当然可以在逐个映射类时完成它......但是如何自动化呢?

这是我目前的配置代码:

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();
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 7

假设您已经从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();
Run Code Online (Sandbox Code Playgroud)

选择要缓存的查询只需在Criteria实例上调用SetCacheable(true)即可​​.

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

这是关于NHibernate的一级和二级缓存的史诗博客文章,很好的参考资料.

  • 虽然缓存查询在没有缓存实体的情况下也没有用,但在映射中使用例如`<cache usage ="read-write"/>`. (2认同)