如何配置Fluent NHibernate将查询输出到Trace或Debug而不是Console?

时间:2010-01-25 18:26:02

标签: c# .net asp.net nhibernate fluent-nhibernate

如何配置Fluent NHibernate将查询输出到Trace或Debug而不是Console? 我正在使用MsSqlConfiguration.MsSql2008.ShowSql(),但它没有参数,我在Google上找不到任何内容。

3 个答案:

答案 0 :(得分:95)

我可以从论坛和博客文章中看到,在我之前的许多其他人都在寻找一种方法来获取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,以免暗示特定目的,因为您可能希望稍后为其添加其他功能。

希望这对其他人有帮助! : - )

答案 1 :(得分:33)

您可能想要使用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的任何变体中都是一样的。

答案 2 :(得分:11)

我没有尝试使用SQL Server,但是使用SQLite,以下代码将在输出窗口中显示生成的SQL(调试菜单 - &gt; Windows - &gt;输出,在VS2008中)。

“输出”窗口中的“显示输出:”组合框应设置为“调试” - VS2008会自动为我做这个。

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

警告 - 打开此功能可以大大减慢执行速度。