2012-09-21 2 views
0

J'écris une application Windows Forms qui doit stocker des données d'entités de NHibernate dans un cache de 2ème couche persistant. Pour autant que je sache, le seul fournisseur de cache de niveau 2 qui satisfait mes exigences d'application est la prévalence, mais je me fais une exception maladroite quand je configure:NHibernate 2e niveau de cache avec prévalence

System.ArgumentNullException was unhandled 
    Message=Value cannot be null. 
Parameter name: key 
    Source=mscorlib 
    ParamName=key 
    StackTrace: 
    at System.Collections.Generic.Dictionary`2.FindEntry(TKey key) 
    at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value) 
    at NHibernate.Impl.SessionFactoryObjectFactory.GetNamedInstance(String name) 
    at NHibernate.Impl.SessionFactoryImpl.GetRealObject(StreamingContext context) 
    at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder) 
    at System.Runtime.Serialization.ObjectManager.DoFixups() 
    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
    at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream) 
    at Bamboo.Prevalence.Implementation.PendingCommandsEnumerator.NextCommand() 
    at Bamboo.Prevalence.Implementation.PendingCommandsEnumerator.MoveNext() 
    at Bamboo.Prevalence.PrevalenceEngine.RecoverCommands(CommandLogReader reader, ExceptionDuringRecoveryHandler handler) 
    at Bamboo.Prevalence.PrevalenceEngine.RecoverSystem(Type systemType, CommandLogReader reader, ExceptionDuringRecoveryHandler handler) 
    at Bamboo.Prevalence.PrevalenceEngine..ctor(Type systemType, String prevalenceBase, BinaryFormatter formatter, ExceptionDuringRecoveryHandler handler) 
    at Bamboo.Prevalence.TransparentPrevalenceEngine..ctor(Type systemType, String prevalenceBase, BinaryFormatter formatter, ExceptionDuringRecoveryHandler handler) 
    at Bamboo.Prevalence.TransparentPrevalenceEngine..ctor(Type systemType, String prevalenceBase, BinaryFormatter formatter) 
    at Bamboo.Prevalence.PrevalenceActivator.CreateTransparentEngine(Type systemType, String prevalenceBase, BinaryFormatter formatter) 
    at Bamboo.Prevalence.PrevalenceActivator.CreateTransparentEngine(Type systemType, String prevalenceBase) 
    at NHibernate.Caches.Prevalence.PrevalenceCacheProvider.SetupEngine() 
    at NHibernate.Caches.Prevalence.PrevalenceCacheProvider.Start(IDictionary`2 properties) 
    at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) 
    at NHibernate.Cfg.Configuration.BuildSessionFactory() 
    at AcessoDados.DB.Configure() in C:\Users\Herberth\MyProject\DataAccess\DB.cs:line 78 

C'est seulement code supplémentaire Je suis using:

configuration.SessionFactory().Caching.Through<NHibernate.Caches.Prevalence.PrevalenceCacheProvider>().PrefixingRegionsWith("MyRegion").WithDefaultExpiration(60); 

Cela fonctionne très bien quand je commente cette ligne (sans le cache, bien sûr);

Voici le code complet j'utilise:

configuration = new Configuration(); 
var mapper = new ModelMapper(); 
mapper.AddMappings(Assembly.GetExecutingAssembly().GetExportedTypes()); 
HbmMapping domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); 
configuration.DataBaseIntegration(c => 
{ 
    c.Dialect<MySQLDialect>(); 
    c.ConnectionString = @"Server=localhost;Database=mydb;Uid=root;Pwd=mypwd"; 
    c.ConnectionString = DBConnectionStrings.Principal; 
    c.LogFormattedSql = true; 
    c.LogSqlInConsole = true; 
    c.IsolationLevel = System.Data.IsolationLevel.ReadCommitted; 
}); 
configuration.AddMapping(domainMapping); 
configuration.Cache(c => { c.UseQueryCache = true; }); 
configuration.SessionFactory().Caching.Through<NHibernate.Caches.Prevalence.PrevalenceCacheProvider>().PrefixingRegionsWith("MyRegion").WithDefaultExpiration(60); 
SessionFactory = configuration.BuildSessionFactory(); 

Toutes les dépendances sont dans leur dernière version.

Merci d'avance!

+0

Où est le reste de l'exception? –

+0

Désolé, j'ai modifié la question. –

Répondre

0

J'ai eu ce problème car les répertoires NHibernate.Cache.StandardQueryCache et UpdateTimestampsCache dans le répertoire exécutable sont obsolètes.

Cependant, cela a conduit au problème suivant - je n'ai pas pu installer sous Program Files car NHibernate a tenté de créer ces répertoires lors de la première exécution.

Questions connexes