2010-08-18 127 views
1

更新:現在已解決,請參閱下面的答案。正確的NHibernate映射存儲過程?


我有一點試圖找出編寫存儲過程MSSQL的NHibernate的映射文件(的.hbm.xml)的正確方法的麻煩。

存儲過程接受兩個參數並返回包含多個具有整數值的列的單個行結果集。

我的映射文件如下:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="TestApp.DataAccess" 
        namespace="TestApp.DataAccess.Models"> 

    <class name="MonthlyInstructionCount" lazy="true"> 
    <id name="Id" column="Month"> 
     <generator class="native" /> 
    </id> 

    <property name="Month" /> 
    <property name="MapRequests" /> 
    <property name="Instructions" /> 
    <property name="DrainsLookSee" /> 
    <property name="DrainsFullCctv" /> 
    <property name="Soils" /> 
    <property name="Roots"/> 
    <property name="Arb" /> 

    <loader query-ref="MI_MonthlyInstructionCount"/> 
    </class> 

    <sql-query name="MI_MonthlyInstructionCount"> 
    <return class ="MonthlyInstructionCount"> 
     <return-property name="Month" column="Month" /> 
     <return-property name="MapRequests" column="MapRequests" /> 
     <return-property name="Instructions" column="Instructions" /> 
     <return-property name="DrainsLookSee" column="DrainsLookSee" /> 
     <return-property name="DrainsFullCctv" column="DrainsFullCctv" /> 
     <return-property name="Soils" column="Soils" /> 
     <return-property name="Roots" column="Roots" /> 
     <return-property name="Arb" column="Arb" /> 
    </return> 
    exec dbo.MI_MonthlyInstructionCount :StartDate :NumberOfMonths 
    </sql-query> 

</hibernate-mapping> 

我也曾嘗試以下,有人在爲另一個人是具有與存儲過程類似問題論壇的建議......

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="TestApp.DataAccess" 
        namespace="TestApp.DataAccess.Models"> 

    <sql-query name="MI_MonthlyInstructionCount"> 
    <return class ="MonthlyInstructionCount" /> 
    exec dbo.MI_MonthlyInstructionCount :StartDate :NumberOfMonths 
    </sql-query> 

</hibernate-mapping> 

兩者都不似乎工作...我只是得到以下錯誤:

The type initializer for 'TestApp.DataAccess.Sql.NHibernateHelper' threw an exception.

{"Errors in named queries: {MI_MonthlyInstructionCount}"}

我看不到它是存儲過程(雖然錯誤會顯示它是...),因爲它似乎在MSSQL Server Manager中成功運行。

任何幫助非常感謝!乾杯!

+0

MonthInstructionCount需要是映射類嗎?從你的例子中不清楚,但我會認爲這將是一個DTO,並可能更好地使用投影處理。 – DanP 2010-08-18 15:04:48

+0

最終,我需要在6個月的時間內顯示「指令計數」表。我們已經編寫了一個可以顯示對象列表的類似DataTable的組件,所以我們希望使用它來顯示這些信息。我們的DataTable組件需要IEnumerable 形式的數據源。因此需要映射類的原因。我們需要能夠傳遞一個IEnumerable 作爲它的數據源。謝謝 – 2010-08-19 08:32:50

回答

3

已解決:我現在已經解決了這個問題。首先是將ID屬性設置爲「name = Id」而不是「name = Month」的問題。其次,我必須將exec命令包裝在CDATA中,並在參數之間放置一個逗號分隔符。下面的完整工作映射文件供將來參考遇到類似問題的任何人使用。

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="TestApp.DataAccess" 
        namespace="TestApp.DataAccess.Models"> 

    <class name="MonthlyInstructionCount" lazy="true"> 
    <id name="Month"> 
     <generator class="native" /> 
    </id> 

    <property name="MapRequests" /> 
    <property name="Instructions" /> 
    <property name="DrainsLookSee" /> 
    <property name="DrainsFullCctv" /> 
    <property name="Soils" /> 
    <property name="Roots"/> 
    <property name="Arb" /> 

    <loader query-ref="MI_MonthlyInstructionCount"/> 
    </class> 

    <sql-query name="MI_MonthlyInstructionCount"> 
    <return class="MonthlyInstructionCount"> 
     <return-property name="Month" column="Month" /> 
     <return-property name="MapRequests" column="MapRequests" /> 
     <return-property name="Instructions" column="Instructions" /> 
     <return-property name="DrainsLookSee" column="DrainsLookSee" /> 
     <return-property name="DrainsFullCctv" column="DrainsFullCctv" /> 
     <return-property name="Soils" column="Soils" /> 
     <return-property name="Roots" column="Roots" /> 
     <return-property name="Arb" column="Arb" /> 
    </return> 
    <![CDATA[ 
    exec MI_MonthlyInstructionCount :StartDate, :NumberOfMonths 
    ]]> 
    </sql-query> 

</hibernate-mapping> 

乾杯!