更新:我已經在下面回答我的問題,採取偷看,讓我知道,如果你有這樣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