Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NHibernate将nChar列映射到枚举类型_C#_Sql Server_Nhibernate_Enums - Fatal编程技术网

C# 使用NHibernate将nChar列映射到枚举类型

C# 使用NHibernate将nChar列映射到枚举类型,c#,sql-server,nhibernate,enums,C#,Sql Server,Nhibernate,Enums,我正在尝试将表frp(SQL Server 2005 DB)映射到包含枚举的类: public class MyClass{ private YesNoOptional addressSetting; public YesNoOptional AddressSetting{ {get; set;} } } 这将指示将三个值中的一个插入相应的列-“Y”、“N”、“O”。此柱为nchar(1)型 我的映射文件是这样的(addressSetting是导致问题的属性): 使用上面的配置,我

我正在尝试将表frp(SQL Server 2005 DB)映射到包含枚举的类:

public class MyClass{
private YesNoOptional addressSetting;
public YesNoOptional AddressSetting{
    {get; set;}
}
}

这将指示将三个值中的一个插入相应的列-“Y”、“N”、“O”。此柱为nchar(1)型

我的映射文件是这样的(addressSetting是导致问题的属性):


使用上面的配置,我得到以下错误: NHibernate.ADOException:无法初始化集合:System.FormatException:输入字符串的格式不正确

如果我尝试使用如下自定义类型映射枚举:

<property name="AddressSetting" column="INT_ADDRESS_REQ" type="ML.Types.YesNoOptional, ML.Types" ></property>
 <property name="AddressSetting" column="INT_ADDRESS_REQ" type="String" ></property>

错误:System.FormatException:输入字符串的格式不正确

接下来,如果我尝试使用如下特定类型:

<property name="AddressSetting" column="INT_ADDRESS_REQ" type="ML.Types.YesNoOptional, ML.Types" ></property>
 <property name="AddressSetting" column="INT_ADDRESS_REQ" type="String" ></property>

生成此错误:NHibernate.PropertyAccessException:类型System.String无法分配给类型System.ArgumentException:类型为“System.String”的对象无法转换为类型“ML.Types.YesNoOptional”

最后,我尝试将类型指定为char,如下所示:

<property name="AddressSetting" column="INT_ADDRESS_REQ" type="Char" ></property>

这会更好一些,因为它不会抛出错误,但是,不是从表中返回字符并将其映射到枚举类型,而是返回字符的ASCII值-因此Y由89表示

我希望有人能解释我做错了什么,或者为什么会这样

谢谢


Morris

我认为这是因为您试图将字符串映射到枚举。默认情况下,枚举类型的基类型是整数

您可以使用类似于
Nullable
的方法来实现所需的功能,而不是使用枚举。但是如果您真的想使用一个,将backing字段保留为
nchar(1)
列,我会进行如下查询:

SELECT intAddressSetting = CASE AddressSetting WHEN 'Y' THEN  1
                                               WHEN 'N' THEN  0
                                               ELSE -1 
                           END
 FROM table
并使用此字段映射到枚举


根据需要更改值,通常“否”值的值为
0
,而“是”值的值为
1
,但在您的枚举中,它们是相反的,可选值为
2
,我会将其设置为
-1

,我想我在另一种方法上遇到了困难,这可能是正确的方法,也可能不是正确的方法

如上所述,返回了ASCII码值,因此对于Y,我得到的值为89,我扩展了枚举以使用这些值,如下所示:

公共枚举是可选的{ 是=89, 否=79, 可选=78 }


当从数据库返回

时,可以正确地填充这些值。您可以考虑为此创建自定义IUserType。我写了一篇关于使用DateTime进行类似操作的博客文章,您可以复制并粘贴90%的代码:

基本上,最大的变化是NullSafeSet和NullSafeGet。在NullSafeSet中,您需要在枚举上进行切换,然后相应地将DB值设置为Y/N/O。在NullSafeGet中,您需要对结果进行切换(首先运行Char.ToLower()可能不是一个坏主意)并返回相应的枚举


简单、功能强大,而且它不会破坏您的模型以与数据库一起工作。

实现一个IUserType,然后为query.substitutions提供一个值以方便查询

<property name="query.substitutions">yes 'Y', no 'N', opt 'O'</property>
yes'Y',no'N',opt'O'

谢谢,但我是NHibernate的新手,你能告诉我在哪里编辑SQL来完成这项工作吗?我认为当你开始让你的代码反映你的数据库时,你正在走一条可怕的道路,对延迟响应感到担忧。感谢大家的帮助,尝试了这些解决方案,这些似乎比我的想法要好得多,我的想法是破解枚举以匹配ASCII db值。