2010-04-01 111 views
11

我想了解如何连贯NHibernate配置启用查询,实体等2级缓存...而在同一时间使用自动映射。网上关于如何做到这一点的信息很少。当然,它可以在逐个映射类时完成......但是如何自动映射?功能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(); 

谢谢!

回答

7

假设您已经从NHibernate Contribution项目下载了第二级缓存提供程序,您应该能够使用以下内容在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(); 

选择要缓存的查询只是在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

+2

虽然缓存查询并没有那么有用,如果您不要缓存实体,请使用例如映射中的“。 – UpTheCreek 2011-05-12 18:09:35

1

我一直在挣扎了一会儿,惊讶是在那里的信息多么少。这个问题是我能找到的,甚至在这里接受的答案并没有说如何启用实体缓存最好。这是我发现的。

要启用二级缓存:

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()如果你想。