2010-04-01 24 views
11

Estoy tratando de entender cómo configurar Fluidez NHibernate para habilitar el almacenamiento en caché de segundo nivel para consultas, entidades, etc. ... Y al mismo tiempo usar la automatización. Hay muy poca información en línea sobre cómo hacer eso. Claro que se puede hacer al mapear las clases una por una ... Pero ¿qué hay de la automatización?Caché NHibernate fluido con automatización

Aquí está mi código de configuración hasta el momento:

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

Gracias!

Respuesta

7

Suponiendo que ya ha descargado un proveedor de caché de segundo nivel del proyecto Contribución de NHibernate, debería poder usar lo siguiente para inicializar la memoria caché en la configuración de su equipo.

Configuration config = Fluently.Configure() 
.Database 
(
    MsSqlConfiguration.MsSql2005 
    .ConnectionString(@"[MY CONNECTION STRING]") 
    .Cache(c => c.UseQueryCache().ProviderClass<YourCacheProviderOfChoice>()) 
) 
.Mappings(m => m.AutoMappings.Add(model)) 
.BuildConfiguration(); 

Selección de las consultas que desee caché es simplemente una cuestión de llamar SetCacheable (verdadero) en la instancia Criterios.

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

Este es un epic blog post en primera y segunda memorias caché de nivel de NHibernate, buen material de referencia.

+2

Aunque las consultas de almacenamiento en memoria caché no son tan útiles si no se almacenan en caché también las entidades, utilizando, p. '' en la asignación. – UpTheCreek

1

He estado luchando con esto por un tiempo y me sorprendió la poca información que hay disponible. Esta pregunta es lo mejor que pude encontrar e incluso aquí la respuesta aceptada no dice cómo habilitar el almacenamiento en caché de entidades. Esto es lo que descubrí.

Para habilitar caché de segundo nivel:

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

Usted puede utilizar tanto esta como la caché de consultas:

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

Para habilitar el almacenamiento en caché por cada entidad:

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

Por supuesto, puede usar ReadOnly() o NonStrictReadWrite() si lo desea.

Cuestiones relacionadas