2011-11-11 13 views
-4

我決定學習如何使用ORM來避免學習一些SQL(只有錯誤的方法是去使用無SQL)。如何使用Log4Net從NHibernate獲得真正的SQL

我已經能夠使用Log4Net獲得Nhibernate「SQL」,使用了很多博客中複製的說明。我得到「SQL」是這樣的:

NHibernate.Loader.Loader: 2011-11-11 15:03:14,348 [9] INFO NHibernate.Loader.Loader [(null)] - SELECT this_.RegionID as RegionID9_0_, this_.RegionDescription as RegionDe2_9_0_ FROM Region this_ 

現在,糾正我,如果我錯了,但不是SQL,我不明白爲什麼所有的這些博客說話喜歡它。

奇怪的是,早些時候當我搞亂log4net時,我確信我能夠將普通SQL記錄到日誌文件中。當我基本上做了一個實體的getall()(讀取整個表格)時,所有單個查詢都在列表中用查詢中的id列出 - 每行(實體)都有一個查詢。我絕對沒有想到這一點。任何人都可以告訴我這是怎麼用log4net完成的?下面是我的配置現在:

<log4net> 
<appender name="DebugSQL" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
</appender> 

<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net"> 
    <param name="File" value="log.txt"/> 
    <param name="AppendToFile" value="true"/> 
    <param name="DatePattern" value="yyyy.MM.dd"/> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
      <conversionpattern value="%d %p %m%n"> 
      </conversionpattern> 
    </layout> 
    </appender> 

<logger name="NHibernate.Loader.Loader" additivity="false"> 
    <level value="All"/> 
    <appender-ref ref="DebugSQL" /> 
</logger> 

編輯:我現在知道它是SQL的,我不能重現我前面看到,因爲惰性加載了之前所發出的SQL:

NHibernate.SQL: SELECT region_.RegionDescription as RegionDe2_9_ FROM Region region_ WHERE [email protected];@p0 = 1 [Type: Int32 (0)] 
NHibernate.SQL: SELECT region_.RegionDescription as RegionDe2_9_ FROM Region region_ WHERE [email protected];@p0 = 2 [Type: Int32 (0)] 
NHibernate.SQL: SELECT region_.RegionDescription as RegionDe2_9_ FROM Region region_ WHERE [email protected];@p0 = 3 [Type: Int32 (0)] 
NHibernate.SQL: SELECT region_.RegionDescription as RegionDe2_9_ FROM Region region_ WHERE [email protected];@p0 = 4 [Type: Int32 (0)] 
+0

「所有單個查詢都在列表中,其中查詢中包含id - 每行(實體)中包含一個」 - 這是理解SQL將極大地幫助您的主要示例。搜索「nhibernate N + 1」 – AlexCuse

+0

嗯,我並沒有想象看到x行的x查詢。原因在於它在啓用lazyloading時執行此操作。順便說一句,當我說我應該完全跳過SQL,我的意思是我應該跳到對象數據庫或圖形數據庫。我最終並不反對學習SQL,但是使用ORM只是感覺不對,並且像一個巨大的黑客。編程語言領域處理對象,我也很清楚該數據庫也應該如此。 –

+0

您在其他評論中非常清楚地表明您期望在X行中看到X個查詢。當使用替代數據庫時,您將遇到與關係數據庫相同的問題(如果不是更多)。但是,如果你對最成熟的解決方案感到不舒服,並稱之爲「巨大的黑客攻擊」,我懷疑你會選擇更適合的解決方案。在一天結束的時候,我們所做的一切都是「巨大的黑客」,但其中一些實際上表現相當不錯。 – AlexCuse

回答

2

你破折號後看到了什麼在日誌中確實是SQL。它在語法和語義上是正確的,但它看起來很醜陋。當SQL不是手動編寫時,這是司空見慣的:代碼生成器使用諸如RegionID9_0_這樣的名稱來消除歧義,使得輸出對於人類讀者而言看起來不尋常。

+0

好吧,所以它只是普通的普通SQL。謝謝。我管理在Management Studio中執行查詢:SELECT this_.RegionID as RegionID9_0_,this_.RegionDescription as RegionDe2_9_0_ FROM Northwind.dbo.Region this_ –

2

變化conversionPattern從4號線:

%date [%thread] %-5level %logger [%property{NDC}] - %message%newline 

%message%newline 

,你將只記錄的SQL(這是%消息的值)

以下行,從你的日誌,是SQL:

SELECT this_.RegionID as RegionID9_0_, this_.RegionDescription as RegionDe2_9_0_ FROM Region this_ 
+0

是的,問題基本上是我預計會有x個查詢來獲得x行。所以我認爲SQL是HQL或其他東西。 –

相關問題