2010-03-20 70 views
2

當ISession.Get被調用來通過其鍵而不是使用動態SQL來獲取實體時,我想讓NHibernate調用存儲過程。NHibernate只有存儲過程

我們一直在使用NHibernate並允許它爲查詢和插入/更新/刪除生成我們的SQL,但現在可能必須將我們的應用程序部署到一個需要我們使用存儲過程來訪問所有數據庫的環境。我們可以在我們的.hbm.xml映射文件中使用sql-insert,sql-update和sql-delete進行插入/更新/刪除操作。我們的hql和標準查詢將不得不用存儲過程調用來替代。

但是,我還沒有想出如何強制NHibernate使用自定義存儲過程通過其密鑰獲取實體。我仍然希望能夠調用ISession.Get,如:

using (ISession session = MySessionFactory.OpenSession()) 
{ 
    return session.Get<Customer>(customerId); 
} 

,並延遲加載的對象,但我想NHibernate的調用,而不是生成動態SQL我「GetCustomerById」存儲過程。

可以這樣做嗎?

也許NHibernate不再適合我們必須支持的新環境。

+7

老實說,你真的需要改變環境,這些存儲過程要求絕對是一成不變的,它們不提供任何安全性和性能方面的好處,如果不是開發人員幾個月的時間,可以輕鬆地爲您的項目增加數週。這聽起來完全是一個管理缺陷。 – 2010-03-20 01:28:23

+1

我不得不同意克里斯。我不知道這是否是一個管理決策,但是爲了使用SP而從多個角度來看並不是一個好的做法。 – 2010-03-20 01:34:21

+0

我同意SP是一個糟糕的路要走。我介紹了NH,以避免寫出數百個存儲過程並提高我們的生產力,這非常棒。客戶站點的某些人認爲這是安全性要求,以防止我假設的SQL注入。它可能是管理層,數據庫管理員,基礎設施/ IT,但我無法與最終決策者溝通。很明顯,SQL注入在包含動態SQL的SP中可能仍是一個問題,因此策略可能會產生虛假的安全感。 – ChrisB2010 2010-03-20 01:54:29

回答

3

我沒有嘗試過,但你可能想看看native sql and custom loader概念。

這裏有一個很好的文章由Ayende Rahien:Using NHibernate With Stored Procedures

這裏的另一個更容易理解的基礎上NH beta版由斯科特·麥克馬斯特版本:Stored Procedures in NHibernate

+0

感謝您的信息。它看起來像加載器的想法是我正在尋找,併成爲NH的新手,我還不知道它。一些好消息:我們現在正在開發的項目不會被部署到受限制的環境中,所以暫時我們要讓NH創建SQL。 – ChrisB2010 2010-03-23 02:48:32