NHibernate を使用してマップされ、第 2 レベルのキャッシュ (memcached) にキャッシュされているクラス「Company」があります。私たちのチームは最近、データベースに保存される新しい bool プロパティをこのクラスに追加しました。
開発環境ではすべて問題なく動作しましたが、ステージング環境 (ライブ データベースを共有) に展開するとすぐに、次のエラーが発生し始めました。
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at (Object , Object[] , SetterCallback )
at NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values)
at NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(Object entity, Object[] values)
at NHibernate.Persister.Entity.AbstractEntityPersister.SetPropertyValues(Object obj, Object[] values, EntityMode entityMode)
at NHibernate.Cache.Entry.CacheEntry.Assemble(Object[] values, Object result, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session)
at NHibernate.Cache.Entry.CacheEntry.Assemble(Object instance, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session)
at NHibernate.Event.Default.DefaultLoadEventListener.AssembleCacheEntry(CacheEntry entry, Object id, IEntityPersister persister, LoadEvent event)
at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromSecondLevelCache(LoadEvent event, IEntityPersister persister, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
私の推測では、NHibernate は古いキャッシュ エントリ (新しいプロパティを持たない) を新しい Company オブジェクトに逆シリアル化できないということです。ステージング環境で第 2 レベルのキャッシュを無効にし、ISE が停止したため、これを確認したと思います。
私の質問は、NHibernate が例外をバブルアップする代わりにキャッシュ エントリをデシリアライズできない場合、どうすれば NHibernate をデータベースにフォールスルーさせることができるのでしょうか? 他の誰かがこの問題に遭遇しましたか?
現時点では、第 2 レベルのキャッシュをオフにしてデプロイし、memcached サーバーを再起動してから、第 2 レベルのキャッシュを再度有効にする必要があると思います。ただし、このソリューションは理想的ではありません。誰かがより良い提案を持っているなら、私はとても感謝しています.