如何配置Fluent NHibernate将查询输出到Trace或Debug而不是Console?
我正在使用MsSqlConfiguration.MsSql2008.ShowSql()
,但它没有参数,我在Google上找不到任何内容。
答案 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()
;
警告 - 打开此功能可以大大减慢执行速度。