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

时间:2009-12-07 23:51:51

标签: nhibernate fluent-nhibernate

我的一个队列正在根据用户的各种输入构建一个稍长的搜索查询。我们已经使用Fluent NHibernate对NHibernate进行了映射,除了一些noob错误之外,一切似乎进展顺利。

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

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

映射简单,数据存储简单;如果我至少理解为什么/如何在运行相同的状态手动失败时NHibernate正在使这个工作,我会好好单独离开...有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

NHibernate参数化其所有查询,并将这样做定义在参数中传递给SQL的值。这可能是你要问的问题,我失败的原因是,默认情况下,如果你输入它只会知道差异:

select * from table_name
   where col_name = 5

相比
select * from table_name
   where col_name = '5'

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