2013-03-29 44 views
1

我的工作,需要以下項目:入門/從NHibernate的3.2生成SQL(帶參數)

  • 提取從一個特定的NHibernate 3.2會話完整的SQL查詢。
  • 對查詢執行特定操作(即不necesserily記錄它)
  • 不要在整個系統影響NHibernate的,以避免引入性能問題

我檢查了幾種方法,其中許多人已經出現在計算器上。下面是我的選擇,我現在看到的:

手冊

在最天真和惱人的解決方案,我可以按照業務邏輯和構建查詢自己 - 例如,如果BL建立一個標準的對ID = 5做了限制,我會用SELECT ... WHERE ID = 5建立一個查詢。由於我們有一個非常複雜的BL,我真的很想避免這種情況。

NHibernate的攔截

本來,使用OnPrepareStatement似乎是最好的選擇。不過,我很快discovered查詢的參數不記錄,這使得它很無用。

內省NHibernarnate的的ICriteria

當執行與NHibernate的查詢,我們與包含限制,排序和聚合定義的ICreteria對象做到這一點。當描述here的CriteriaWalker時,我似乎可以對其進行細分。但是,它似乎對複雜的查詢感到困惑。此外,在某些情況下,我們使用NHibernate 3新的「QueryOver」語法,但此解決方案對此無幫助。

使用ILoggerFactory

由於NHibernate的3,你可以自定義寫入日誌工廠(sample)。這會得到完整的SQL,但是,它也會影響整個NHibernate系統,並且它會讓工廠申請特定的ISession,甚至是ISessionFactory。

定製NHibernate的司機

我考慮寫一個代理NHibernate的驅動程序並將其分配給特定的SessionFactory(如描述here)。然而,友好的評論警告說,它在Nhibernate 3.2中的工作時間更長。

使用動態代理

This code使用城堡的動態代理注入自身內部的Isession。我還沒有試過用我的服務器運行它,但我對使用這種激烈的措施有點謹慎。如果沒有其他的工作,但是,我想這是需要考慮的事情。

對此有何建議?

現在我有點卡在選擇去與因爲沒有似乎是在做自己的工作,完全正確的最佳方式。如果還有其他建議,我很樂意聽到他們。

回答

2

我會使用一個標準或自定義日誌記錄框架,並應用自定義過濾器,以檢索線程的數據(例如)標誌來確定會話是否應該被記錄下來。

這樣,你不惹NH內部可言的,只要你不設置標誌,沒有得到記錄。