我应该告诉NHibernate/FNH显式地为映射到字符串列的参数使用字符串数据类型吗?

我应该告诉NHibernate/FNH显式地为映射到字符串列的参数使用字符串数据类型吗?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我的一个团队正在根据用户的各种输入构建一个较长的搜索查询。我们已经用流利的NHibernate绘制了NHibernate,除了一些noob错误之外,一切似乎都进展顺利 在这种搜索中,我们无法解决的一个问题是,对于一个特定的参数,NHibernate正在创建sql,当我们显式地需要输入为字符串时,它将输入视为int。我们有一个字符串属性映射到nvarchar(255)列,该列主要包含整数,不包括一些任意输入,如“临时”或长数字,如超出int限制的4444 在测试过程中,我看到了两件事:1)如果我在

我的一个团队正在根据用户的各种输入构建一个较长的搜索查询。我们已经用流利的NHibernate绘制了NHibernate,除了一些noob错误之外,一切似乎都进展顺利

在这种搜索中,我们无法解决的一个问题是,对于一个特定的参数,NHibernate正在创建sql,当我们显式地需要输入为字符串时,它将输入视为int。我们有一个字符串属性映射到nvarchar(255)列,该列主要包含整数,不包括一些任意输入,如“临时”或长数字,如超出int限制的4444

在测试过程中,我看到了两件事:1)如果我在传入值前加上0,NH将生成一个字符串形式的sql参数,这是恰当的;2) 如果该值可以实际转换为int,则生成的sql会将其视为int。在案例#2中,如果我直接通过sql server运行生成的sql,当查询遇到非整数值时,我会得到一个异常(如上面列出的示例)。出于某种原因,当我让NH做这件事时,我得到了适当的记录,但这没有意义;我希望它会失败,或者至少告诉我,SqlServer无法评估的某些记录有问题


映射简单,数据存储简单;如果我至少能理解手动运行相同状态失败时NHibernate为什么/如何工作,那么我就可以单独离开了。。。有什么想法吗?

您是否将完全相同的代码直接运行到SQL Server中

NHibernate参数化其所有查询,并在此过程中定义参数中传递给SQL的值。这可能就是您要问的,SQL my失败的原因,默认情况下,只有在您输入以下内容时,它才会知道差异:

select * from table_name
   where col_name = 5

select * from table_name
   where col_name = '5'

如果不将其定义为带有的字符串,它将搜索int,并尝试将所有varchar转换为int,这在某些情况下显然会失败。是否直接在SQL Server中运行完全相同的代码

NHibernate参数化其所有查询,并在此过程中定义参数中传递给SQL的值。这可能就是您要问的,SQL my失败的原因,默认情况下,只有在您输入以下内容时,它才会知道差异:

select * from table_name
   where col_name = 5

select * from table_name
   where col_name = '5'

如果您不将其定义为带有的字符串,它将搜索int,并尝试将所有varchar转换为int,这在某些情况下显然会失败。

是的,我使用的是NH Profiler,它向我显示生成的sql,因此我确定我正在运行相同的查询。你的意思是,在幕后,NH使用参数并在参数中指定数据类型,如果生成的SQL只是完整查询的表示,但缺少该规范?我不确定NHProf的输出,但我完全确定NHibernate输出参数化查询,这些查询需要具有类型关联。出于兴趣,我将看一看NHProf,可能会有兴趣看到结果:)是的,我正在使用NH Profiler,它向我显示生成的sql,所以我确定我正在运行相同的查询。你的意思是,在幕后,NH使用参数并在参数中指定数据类型,如果生成的SQL只是完整查询的表示,但缺少该规范?我不确定NHProf的输出,但我完全确定NHibernate输出参数化查询,这些查询需要具有类型关联。出于兴趣,我将看一看NHProf,可能会有兴趣看到结果:)