0

NHibernateのエンティティデータを永続的な第2層キャッシュに保存する必要があるWindowsフォームアプリケーションを作成しています。私の知る限り、アプリの要件を満たす2番目のレベルのキャッシュプロバイダーはPrevalenceだけですが、構成すると厄介な例外が発生します。

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

これは私が使用している追加のコードのみです。

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

この行をコメントアウトすると(もちろん、キャッシュなしで)正常に機能します。

これが私が使用している完全なコードです:

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

すべての依存関係は最新バージョンです。

前もって感謝します!

4

1 に答える 1

0

NHibernate.Cache.StandardQueryCacheディレクトリとUpdateTimestampsCache実行可能ディレクトリが古くなったため、この問題が発生しました。

ただし、これが次の問題につながりProgram Filesます。最初の実行時に NHibernate がこれらのディレクトリを作成しようとしたため、インストールできませんでした。

于 2013-11-21T16:32:24.490 に答える