我有一个使用 NHibernate 映射并缓存在二级缓存 (memcached) 中的类“公司”。我们的团队最近为此类添加了一个新的 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 对象中。我相信我确认了这一点,因为我在我们的暂存环境中禁用了二级缓存并且 ISE 停止了。
所以我想我的问题是,如果 NHibernate 不能反序列化缓存条目而不是冒泡异常,我们如何强制它进入数据库?有没有其他人遇到过这个问题?
我认为现在,我们将不得不在关闭二级缓存的情况下进行部署,重新启动 memcached 服务器,然后重新启用二级缓存。然而,这种解决方案并不理想。如果有人有更好的建议,我将不胜感激。