代码之家  ›  专栏  ›  技术社区  ›  md1337

具有自动应用功能的Fluent NHibernate缓存

  •  11
  • md1337  · 技术社区  · 14 年前

    我试图了解如何配置FluentNHibernate,以便为查询、实体等启用二级缓存…同时使用自动包裹。网上很少有关于如何做到这一点的信息。当然,它可以在一个接一个映射类时完成…但是自动应用呢?

    以下是迄今为止我的配置代码:

    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();
    

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  7
  •   tinonetic    8 年前

    假设您已经从nhibernate贡献项目下载了一个二级缓存提供程序,那么您应该能够使用以下内容在automappings设置中初始化缓存。

    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)的问题。

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

    这是一个 epic blog post 在NHibernate的一级和二级缓存,良好的参考材料。

        2
  •  1
  •   Sergei Tachenov    8 年前

    我已经为此挣扎了一段时间,我很惊讶那里的信息是如此之少。这个问题是我能找到的最好的答案,即使在这里,公认的答案也不能说明如何启用实体缓存。这是我发现的。

    要启用二级缓存:

    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() 如果你愿意的话。