簡體   English   中英

如何配置Fluent NHibernate將查詢輸出到Trace或Debug而不是Console?

[英]How to configure Fluent NHibernate to output queries to Trace or Debug instead of Console?

如何配置Fluent NHibernate將查詢輸出到Trace或Debug而不是Console? 我正在使用MsSqlConfiguration.MsSql2008.ShowSql()但它沒有參數,我在谷歌上找不到任何東西。

我可以從論壇和博客文章中看到,在我之前的很多其他人都在尋找一種方法來獲取SQL語句,因為他們正在准備執行。 答案通常是“你不能”,或“你不應該”。

無論我是否應該,這就是我想要的。

經過幾個小時的搜索,調查和失敗的嘗試,最后我想出了這個。

寫一個攔截器:

using NHibernate;
using System.Diagnostics;

public class SqlStatementInterceptor : EmptyInterceptor
{
    public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
    {
        Trace.WriteLine(sql.ToString());
        return sql;
    }
}

當然,您不必在此處使用Trace.WriteLine() ,您可以將其寫入日志文件或其他任何需要的文件。

在你的連接管理器中,像你這樣連接你的攔截器:

protected virtual void Configure(FluentConfiguration config)
{
    config.ExposeConfiguration(x =>
                                   {
                                       x.SetInterceptor(new SqlStatementInterceptor());
                                   });
}

這並不復雜。 從我的角度來看,肯定比通過Fluent將所有這些XML推送到NHibernate更容易 - 因為Fluent將XML文件抽象化了。

請記住,您只能擁有一個攔截器 - 因此您可能需要將此功能與現有的攔截器集成,如果您已有的話。 在這方面,您可能希望給它一個更廣泛的名稱 - 例如MyAppInterceptor,以免暗示特定目的,因為您可能希望稍后添加其他功能。

希望這對其他人有幫助! :-)

您可能想使用log4net,而不是ShowSql。 以下是一些向Debug發送查詢的配置:

  <configSections>
    <section name="log4net"
     type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>

  <log4net debug="false">
    <appender name="WindowsDebugOutput" type="log4net.Appender.DebugAppender,
         log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"
              value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender>

    <logger name="NHibernate.SQL" additivity="false">
      <level value="DEBUG" />
      <appender-ref ref="WindowsDebugOutput" />
    </logger>
  </log4net>

然后在打開NHibernate會話之前從代碼中調用它:

log4net.Config.XmlConfigurator.Configure();

添加對log4net DLL的引用時,請確保將其“Copy Local”屬性設置為“true”。

這不是特定於FluentNHibernate,它在NHibernate的任何變體中都是一樣的。

我沒有嘗試使用SQL Server,但是使用SQLite,以下代碼將在“ 輸出”窗口中顯示生成的SQL(調試菜單 - > Windows - >輸出,在VS2008中)。

“輸出”窗口中的“顯示輸出:”組合框應設置為“調試” - VS2008會自動為我執行此操作。

            sessionFactory = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard
                            .UsingFile(DbFile)
                            // Display generated SQL in Output window
                            .ShowSql()
                          )
                .Mappings(m => m.AutoMappings.Add( GetAutoPersistenceModel() ))
                .BuildSessionFactory()
                ;

一句警告 - 打開此功能可以大大減慢執行速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM