如何将可为空的枚举映射到 NHibernate 中的整数?
How to map a nullable enum to an integer in NHibernate?
我有一个enum
(值是位标志)如下:
[Flags]
public enum ItemType
{
InventoryPart = 0x1,
Service = 0x2,
Discount = 0x4,
NonInventory = 0x8,
MiscellaneousCharge = 0x10,
InventoryAssembly = 0x20,
DescriptionLine = 0x40,
All = InventoryPart | Service | Discount | NonInventory | MiscellaneousCharge | InventoryAssembly | DescriptionLine,
}
然后我有实体 (Item
),上面有一个 属性(注意:ItemType
是 nullable
):
private ItemType? _itemType;
public ItemType? ItemType { get { return _itemType; } set { _itemType = value; } }
我在 hbm.xml
文件中映射此 属性 如下:
<property name="ItemType" type="Int32" column="ItemType" not-null="false" />
在数据库中,这个字段是一个整数(允许空值)。
当我 运行 代码时,我从 NHibernate 库中得到一个异常:
Invalid Cast (check your mapping for property type mismatches); setter
of PrlSystems.AccountingLibrary.Model.Item
注意:
当这个 属性 (Item.ItemType
) 之前不是一个 nullable
时,一切正常,使得这个 属性 nullable
导致上面提到的异常。此外,对于像 int
s、DateTime
s、nullable
class 这样的内置类型,这些类型的属性可以直接映射到它们的具体类型:int
, DateTime
.
我试过这样映射,但还是不行:
System.Nullable`1[[System.Int32]]
现在正确的 NHibernate 映射应该是什么?
好的,在更详细地研究了这个问题之后,这个问题的主要原因是:
不能将 Enum 值转换为 (int?),只能将其转换为 (int)。
为了解决这个问题,我通过实现 IUserType 接口编写了一个自定义枚举映射器。在那里,我处理可空枚举的明确性。
我有一个enum
(值是位标志)如下:
[Flags]
public enum ItemType
{
InventoryPart = 0x1,
Service = 0x2,
Discount = 0x4,
NonInventory = 0x8,
MiscellaneousCharge = 0x10,
InventoryAssembly = 0x20,
DescriptionLine = 0x40,
All = InventoryPart | Service | Discount | NonInventory | MiscellaneousCharge | InventoryAssembly | DescriptionLine,
}
然后我有实体 (Item
),上面有一个 属性(注意:ItemType
是 nullable
):
private ItemType? _itemType;
public ItemType? ItemType { get { return _itemType; } set { _itemType = value; } }
我在 hbm.xml
文件中映射此 属性 如下:
<property name="ItemType" type="Int32" column="ItemType" not-null="false" />
在数据库中,这个字段是一个整数(允许空值)。
当我 运行 代码时,我从 NHibernate 库中得到一个异常:
Invalid Cast (check your mapping for property type mismatches); setter of PrlSystems.AccountingLibrary.Model.Item
注意:
当这个 属性 (Item.ItemType
) 之前不是一个 nullable
时,一切正常,使得这个 属性 nullable
导致上面提到的异常。此外,对于像 int
s、DateTime
s、nullable
class 这样的内置类型,这些类型的属性可以直接映射到它们的具体类型:int
, DateTime
.
我试过这样映射,但还是不行:
System.Nullable`1[[System.Int32]]
现在正确的 NHibernate 映射应该是什么?
好的,在更详细地研究了这个问题之后,这个问题的主要原因是:
不能将 Enum 值转换为 (int?),只能将其转换为 (int)。
为了解决这个问题,我通过实现 IUserType 接口编写了一个自定义枚举映射器。在那里,我处理可空枚举的明确性。