我是OpenAccess的初学者。我正在根据我的经验编写一些测试代码" Linq to Sql"
我尝试将allow null int字段映射到" NullAble"枚举类型属性,但失败。
在VS.Net的可视化设计器中,如果我设置" Nullable"财产到"真"和"键入"属性为" MyEnum"(" MyEnum"是我定义的枚举)到域类中的属性,编译项目时将返回以下错误。
名称为" MyEnum"的会员类型" MyClass" presistent类不是其列的有效映射。
如果我设置" Nullable"财产到"假"和"键入"属于" MyEnum?"对于域类中的属性,编译传递,但在运行时从数据库获取数据时将返回以下错误。
类型转换器初始化失败。转换器名称为' IntConverter'不转换CLR类型' System.Nullable`1 [[Model.MyEnum,Model,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'到SQL类型' int'。
但是" Linq to Sql"," NullAble"枚举类型属性可以映射到一个类并且工作正常。
提前感谢您的帮助!
答案 0 :(得分:2)
不幸的是,似乎Nullable Enums目前不受支持,但此问题已经解决,您可以在Telerik OpenAccess ORM的未来版本中找到它。
作为一种解决方法,您可以在Domain Class的部分类中创建一个包装器属性,以便正确获取和设置Enum。
您可以按照以下步骤实现此目的: 1)将Domain Class Property的类型更改为“int”,将其Nullable设置为“true”,将其Access Modifier设置为“private”。 2)创建包含Nullable枚举的实体的部分类。 3)添加一个包装器属性并实现其getter和setter,如下所示:
public MyEnum? MyEnumWrapper
{
get
{
if (this.MyEnum.HasValue)
{
return (MyEnum)this.MyEnum.Value;
}
return null;
}
set
{
this.MyEnum = (int?)value;
}
}
关于您获得的mapping error - 它是OpenAccess ORM validation framework的一部分,旨在警告您模型中可能存在的不一致性,并不意味着您的项目不可构建且它也将被修复,实现可以为空的枚举支持。