更新:我已经在下面回答我的问题,采取偷看,让我知道,如果你有这样NHibernate的SQL查询结果导致
执行的更好的方法总结:
当从SQL Management Studio中调用我的sqlserver函数时,我得到一个包含结果{1,2,3}的列表。当使用NHibernate从代码调用方法时,我得到这个列表{1,1,1}。 ('1'是整个结果行,而不是标量'1') 我也尝试过使用不同的数据集,并得到相同的行为。
长篇小说:
我在sql server中有一个sql函数,名为GetHistory(itemId)。它会返回一个包含结果的表格。 当我从SQL Management Studio中查询时,我得到了一个结果列表。我查询通过调用函数像这样:
select * from GetHistory(10001)
我给DB这导致3行。每一行都有一个时间,类型和描述。
在NHibernate中,我特别为此创建了一个新实体,因为没有这样的有机表/实体。 所以我有一个映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="myNamespace" assembly="myAssembly">
<class name="HistoryEvent">
<id name="id" type="long" access="field">
<column name="Id"/>
<generator class="native"/>
</id>
<property name="type" column="Type" type="short" access="field"/>
<property name="time" column="Time" type="datetime" access="field"/>
<property name="description" column="Description" type="string" access="field"/>
</class>
<sql-query name='GetHistory'>
<return class='HistoryEvent, myAssembly' alias='historyEvent'/>
<![CDATA[SELECT * FROM GetHistory(:id)]]>
</sql-query>
</hibernate-mapping>
业务对象是这样的:
public class HistoryEvent
{
private long id;
private short type;
private string description;
private DateTime time;
... here be properties with public getter etc...
}
最后,我把从我的代码这个功能就像这样:检查时
IList result = s.GetNamedQuery("GetHistory").SetInt64("id", id).List();
这个列表与调试器我得到3个实体是同一行3次。 我也试过直接从NHibernate使用查询(使用SQL查询),而不是通过DB功能,但得到了相同的结果。
我的直觉是我的映射出了问题,或者NHibernate出了什么问题:)
帮助!
更好的方式来生成ID的将是在SQL Server中的NEWID()函数。它会生成一个可用于此场景的新GUID。 – 2010-04-27 01:09:15