OrchardCMS主键转long后NHibernate瞬态对象异常排查与解决
解决OrchardCMS 1.10.x主键从int32改为long后出现的NHibernate.TransientObjectException错误
问题背景
我们基于OrchardCMS 1.10.x开发的Web应用,原本使用int32作为ContentItemRecord.Id的主键类型,由于即将达到int32.MaxValue的上限,遂将主键类型改为long。改造完成后,部分操作出现NHibernate.TransientObjectException错误。
错误信息如下:
对象引用未保存的瞬态实例,需先保存或配置级联操作,涉及实体App.Core.Models.XPTOPartRecord。
涉及的实体XPTOPartRecord继承自OrchardCMS的ContentPartRecord,且包含自引用属性ParentXPTOPartRecord。
原因分析
对比int和long模式下的NHibernate日志,发现long模式下触发了unsaved-value:0的判断。
经调试NHibernate确认:问题源于应用特定方法中错误地将ParentXPTOPartRecord.Id初始化为0,NHibernate据此判定该实例为未保存的瞬态对象,从而抛出异常。
解决方案
将ParentXPTOPartRecord直接设为null,而非初始化其Id为0,即可解决该异常。
使用版本
- OrchardCMS 1.10.x
- NHibernate 4.0.0.4000
- Fluent Nhibernate 1.4.0
内容的提问来源于stack exchange,提问作者NatsuDragonEye
相关产品推荐
相关产品推荐

