如何在NHibernate中将可空枚举类型映射为整数类型?
问题原因
你出现转换异常的核心原因是:
- 映射配置中指定type为
Int32时,NHibernate会将数据库返回的整数值/空值映射为int?类型,但你的实体属性是ItemType?类型,.NET 没有提供int?到Nullable<枚举>的默认隐式转换规则,因此触发类型转换失败。 - 非可空阶段能正常运行是因为非可空的枚举和int存在隐式转换,属于巧合可用的情况,并不符合规范映射逻辑。
- 你尝试的
System.Nullable1[[System.Int32]]`本质还是可空int类型,和你的可空枚举属性依然不匹配,因此无法解决问题。
正确映射配置
直接指定映射的type为你的自定义枚举类型即可,NHibernate原生支持枚举(包括可空枚举)和数据库整数的自动转换:
<property name="ItemType" type="PrlSystems.AccountingLibrary.Model.ItemType" column="ItemType" not-null="false" />
如果你的枚举类型定义在独立的类库中,需要补充程序集名称:
<property name="ItemType" type="PrlSystems.AccountingLibrary.Model.ItemType, PrlSystems.AccountingLibrary" column="ItemType" not-null="false" />
注意把上面的程序集名替换为你实际存放ItemType定义的程序集名称即可。
可选的通用写法
如果不想写全限定名,也可以使用NHibernate内置的可空枚举类型处理器:
<property name="ItemType" column="ItemType" not-null="false"> <type name="NHibernate.Type.EnumType, NHibernate"> <param name="enumClass">PrlSystems.AccountingLibrary.Model.ItemType</param> </type> </property>
内容的提问来源于stack exchange,提问作者ActiveX
相关产品推荐
相关产品推荐

