【问题标题】:Fluent NHibernate caching with automappingFluent NHibernate 缓存与自动映射
【发布时间】:2010-04-01 01:51:05
【问题描述】:

我正在尝试了解如何配置 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();

谢谢!

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案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();
    

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

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

    这是一个关于 NHibernate 的一级和二级缓存的epic blog post,很好的参考资料。

    【讨论】:

    • 虽然如果你不缓存实体,缓存查询就没那么有用了,使用例如&lt;cache usage="read-write"/&gt; 在映射中。
    【解决方案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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多