2010-04-01 19 views
11

Sto cercando di capire come configurare Fluent NHibernate per abilitare il caching di secondo livello per query, entità, ecc ... E allo stesso tempo utilizzare la creazione automatica. Ci sono poche informazioni online su come farlo. Certo si può fare quando si mappano le classi una per una ... Ma per quanto riguarda la creazione automatica?Fluent NHibernate caching con automapping

Ecco il mio codice di configurazione finora:

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

Grazie!

risposta

7

Supponendo di aver già scaricato un provider cache di secondo livello dal progetto Contribution di NHibernate, dovresti essere in grado di utilizzare quanto segue per inizializzare la cache all'interno dell'impostazione di 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(); 

Selezionando le query che si desidera cache è semplicemente una questione di chiamare SetCacheable (vero) sull'istanza criteri.

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

Questa è una epic blog post sul primo e secondo livello di cache NHibernate, buon materiale di riferimento.

+2

Anche se la memorizzazione nella cache delle query non è utile se non si memorizzano nella cache anche le entità, utilizzando ad es. '' nella mappatura. – UpTheCreek

1

Ho lottato con questo per un po 'e sono rimasto sorpreso di quante informazioni ci siano. Questa domanda è la migliore che ho trovato e anche qui la risposta accettata non dice come abilitare il caching delle entità. Ecco cosa ho scoperto.

Per abilitare la cache di secondo livello:

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

è possibile utilizzare sia questo e cache delle query:

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

Per abilitare per-entità caching:

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

Naturalmente, è possibile utilizzare ReadOnly() o NonStrictReadWrite() se lo si desidera.

Problemi correlati