2010-04-02 48 views
11

我正在一個存儲過程對一個項目設置NHibernate和我有,由於其複雜性,我們將離開作爲存儲過程的幾個疑問。我想能夠使用NHibernate調用sprocs,但遇到了一個我無法弄清的錯誤。由於我使用流利NHibernate我使用混合模式映射推薦here。但是,當我運行應用程序時,我得到一個「命名查詢未知:AccountsGetSingle」異常,我無法弄清楚原因。我想我的HBM映射可能有問題,因爲我不太熟悉它們,但我不確定。命名查詢未知錯誤試圖調用使用功能NHibernate

我的NHibernate的配置代碼:

private ISessionFactory CreateSessionFactory() 
{ 
    return Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2005 
      .ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB"))) 
       .ShowSql()) 
     .Mappings(m => 
      { 
       m.HbmMappings.AddFromAssemblyOf<Account>(); 
       m.FluentMappings.AddFromAssemblyOf<Account>(); 
      }) 
     .BuildSessionFactory(); 
} 

我的hbm.xml文件是:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <sql-query name="AccountsGetSingle"> 
     <return alias="Account" class="Core, Account"></return> 
     exec AccountsGetSingle 
    </sql-query> 
</hibernate-mapping> 

我所在的地方調用存儲過程的代碼如下所示:

public Account Get() 
{ 
    return _conversation.Session 
     .GetNamedQuery("AccountsGetSingle") 
     .UniqueResult<Account>(); 
} 

任何想法或想法,將不勝感激。謝謝。

更新: @ kibbled_bits的建議,讓我說,我在尋找(下能夠調用從NHibernate的存儲過程)的最終結果,但我仍然不知道爲什麼我沒有按上面所列的方法」工作。我仍然很好奇,因爲它可能爲未來的問題提供有價值的見解。

回答

24

當我使用存儲過程(這隻有當我被迫發生)。我更願意用下面的方法來執行它們:

var list = Session.CreateSQLQuery("exec GetCustomerByNaturalKey ?, ?") 
.AddEntity(typeof(Customer)) 
.SetInt32(0, customerNo) 
.SetDateTime(1, createdDate) 
.List<Customer>(); 

到.SetInt32 /日期的第一個參數就是參數的順序位置。

+0

我不認爲我知道你可以使用.CreateSQLQuery()調用存儲過程,儘管它非常有意義。當我在早上上班時,我會給它一個鏡頭。 – Hamman359 2010-04-04 18:28:23

+1

這工作完美。我能夠成功地調用我的存儲過程而沒有任何問題。謝謝。 – Hamman359 2010-04-06 14:26:49

+2

+1真棒醬。其他答案涉及映射hbm片段。這好多了。 – 2012-08-22 15:40:57

17

我得到了相同的錯誤消息,什麼解決了這個問題對我來說是要確保我的hbm.xml文件屬性「生成操作」設置爲「嵌入的資源」,所以你可能想給它的另一個嘗試。

+0

我儘可能地避免了過程,所以需要做到這一點很少,我一直忘記這樣做。 – MrBoJangles 2015-05-27 20:28:42

1

我已經被這個錯誤抓出了許多倍。

另外兩個問題可能導致此問題。

不添加HBM映射。

用流利的我有以下。

var config = Fluently.Configure() 
       .Database(sqlConfig) 
       .Mappings(c => c.AutoMappings.Add(AutoMap.AssemblyOf<AdvertView>(new QueryAutomappingConfiguration()).UseOverridesFromAssemblyOf<AdvertViewMappingOverride>())) 
       .Mappings(c => c.HbmMappings.AddClasses(typeof(AdvertView), typeof(RelatedAdvertView), typeof(CompanyAtoZListingView))); 

在那裏我錯過了視圖類(它與映射信息與hbm文件配對)。我收到錯誤。

當我添加新視圖'typeof(CompanyAtoZListingView)'它工作正常。

.Mappings(c => c.HbmMappings.AddClasses(typeof(AdvertView), typeof(RelatedAdvertView), typeof(CompanyAtoZListingView))); 

此外,請檢查hbm文件以確保參數是正確的。

相關問題