2010-04-01 93 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()如果你想。