2008-09-24 74 views

回答

39

你可以把這樣的事情在你的app.config/web.config文件:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 
在配置節點

在configSections節點

<log4net> 
    <appender name="NHibernateFileLog" type="log4net.Appender.FileAppender"> 
    <file value="logs/nhibernate.txt" /> 
    <appendToFile value="false" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG"/> 
    <appender-ref ref="NHibernateFileLog"/> 
    </logger> 
</log4net> 

而且別忘了打電話

log4net.Config.XmlConfigurator.Configure(); 

在您的應用程序的啓動,或把

[assembly: log4net.Config.XmlConfigurator(Watch=true)] 

在AssemblyInfo.cs中

在配置設置中,「show_sql」屬性設置爲true。

6

使用sql server profiler。編輯(1年後):正如@Toran Billups所述,NHibernate profiler Ayende寫的非常酷。

+0

是比通過MB日誌文件涉水更容易。 – 2009-02-06 15:53:48

16

在配置設置中,將「show_sql」屬性設置爲true。 這將導致SQL在NHibernate的日誌文件中輸出,由log4net提供。

+0

不錯。我忘了那個。 *點擊* – 2008-09-24 19:05:21

+0

爲什麼這不是公認的答案? :) 謝謝你的提示。 – 2012-10-03 08:23:47

+0

這並不顯示完整的SQL。我看不到實際值,如下所示:`SELECT application0_.ApplicationId as app === App1_101_1_,application0_.ApplicationNumberCounty as ApplicationNu2_101_1 ...' – 2016-03-28 19:22:07

5

您也可以嘗試NHibernate Profiler(30天試用,如果沒有其他)。這個工具是最好的恕我直言。

這不僅顯示生成的SQL也警告/建議的/ etc

1

如果你使用SQL Server(不表達),你可以嘗試SQL Server Profiler中。

5

我有點遲,我知道,但這是竅門,它是獨立的工具/數據庫/框架。 而不是那些有效的選項,我使用NH Interceptors

首先,實施延伸NHibernate.EmptyInterceptor並實現NHibernate.IInterceptor類:

using NHibernate; 

namespace WebApplication2.Infrastructure 
{ 
    public class SQLDebugOutput : EmptyInterceptor, IInterceptor 
    { 
     public override NHibernate.SqlCommand.SqlString 
      OnPrepareStatement(NHibernate.SqlCommand.SqlString sql) 
     { 
      System.Diagnostics.Debug.WriteLine("NH: " + sql); 

      return base.OnPrepareStatement(sql); 
     } 
    } 
} 

然後,當你打開你的會議只是通過一個實例。請務必僅在調試時進行:

public static void OpenSession() { 

#if DEBUG 
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput()); 

#else 
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(); 

#endif 
} 

就是這樣。

從現在開始,你的sql命令就像這些...

var totalPostsCount = Database.Session.Query<Post>().Count(); 

var currentPostPage = Database.Session.Query<Post>() 
     .OrderByDescending(c => c.CreatedAt) 
     .Skip((page - 1) * PostsPerPage) 
     .Take(PostsPerPage) 
     .ToList(); 

..顯示直接在輸出窗口:

NH:SELECT CAST(COUNT(*)作爲INT)作爲col_0_0_從帖子post0_

NH:選擇post0_.Id作爲Id3_,post0_.user_id爲user2_3_,post0_.Title爲 Title3_,post0_.Slug爲Slug3_,post0_.Content爲Content3_, post0_.created_at爲created6_3_,post0_.updated_at爲updated7_3_, post0_.deleted_at從帖子post0_ deleted8_3_通過訂購post0_.created_at desc限制?抵消?

相關問題