2010-04-01 7 views
11

J'essaie de comprendre comment configurer Fluent NHibernate pour activer la mise en cache de second niveau pour les requêtes, les entités, etc ... Et en même temps utiliser l'automapping. Il y a très peu d'informations en ligne sur la façon de le faire. Bien sûr, cela peut être fait lors de la cartographie des classes un par un ... Mais qu'en est-il de l'automapping?Mise en cache NHibernate fluide avec automapping

Voici mon code de configuration jusqu'à présent:

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

Merci!

Répondre

7

En supposant que vous ayez déjà téléchargé un fournisseur de cache de second niveau à partir du projet de contribution NHibernate, vous devriez pouvoir utiliser ce qui suit pour initialiser le cache dans votre configuration d'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(); 

Sélection des requêtes à cache est tout simplement une question d'appeler SetCacheable (true) sur votre instance Critères.

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

Ceci est une epic blog post sur des premier et second caches de niveau, bonne documentation de référence NHibernate.

+2

Bien que les requêtes de mise en cache ne soient pas très utiles si vous ne mettez pas en cache les entités, en utilisant, par exemple, '' dans le mapping. – UpTheCreek

1

J'ai eu du mal avec cela pendant un moment et j'ai été surpris du peu d'informations disponibles. Cette question est la meilleure que je puisse trouver et même ici, la réponse acceptée ne dit pas comment activer la mise en cache des entités. Voici ce que j'ai découvert.

Pour activer cache de second niveau:

Fluently.Configure() 
    .Database(/* your DB config */) 
    .Cache(c => c.UseSecondLevelCache().ProviderClass<CacheProviderClass>()) 

Vous pouvez utiliser à la fois ceci et cache de requête:

Fluently.Configure() 
    .Database(/* your DB config */) 
    .Cache(c => c.UseSecondLevelCache() 
     .UseQueryCache() 
     .ProviderClass<CacheProviderClass>()) 

Pour activer la mise en cache par entité:

.Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Entity>() 
       .Conventions.Add(ConventionBuilder.Class.Always(c => c.Cache.ReadWrite())) 
     ) 
) 

Bien sûr, vous pouvez utiliser ReadOnly() ou NonStrictReadWrite() si vous le souhaitez.

Questions connexes