如何configurationstream利的NHibernate输出查询,而不是控制台跟踪或debugging?

如何configurationstream利的NHibernate输出查询到跟踪或debugging,而不是控制台? 我正在使用MsSqlConfiguration.MsSql2008.ShowSql()但它没有参数,我无法在Google上find任何东西。

我可以从论坛和博客文章中看到,在我之前有很多人正在寻找一种获取SQL语句的方法,因为它们正在准备执行。 答案通常是“你不能”或“你不应该”的概念。

不pipe我是否应该,这就是我想要的。

经过几个小时的search,调查和失败的尝试,最后我想出了这个。

写一个拦截器:

 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() ,你可以把它写到一个日志文件,或者任何你需要的东西。

在你的连接pipe理器中,像下面这样连接你的Interceptor:

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

这并不复杂。 从我的angular度来看,当然比试图将所有这些XML通过Fluent推送到NHibernate更容易 – 因为Fluent会将XML文件抽象出来。

请记住,只能有一个拦截器 – 所以你可能需要将这个特性与你现有的拦截器集成,如果你已经有了。 在这个笔记上,你可能想给它一个更广泛的名称 – 例如MyAppInterceptor,以免暗示一个特定的目的,因为你可能想在稍后添加其他function。

希望这对别人有帮助! 🙂

您可能要使用log4net,而不是ShowSql。 以下是将查询发送到Debug的一些configuration:

  <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的引用时,请确保将其“复制本地”属性设置为“true”。

这不是特定于FluentNHibernate,它在NHibernate的任何变种中都是一样的。

我还没有尝试过这与SQL Server,但与SQLite,下面的代码将显示输出窗口(debugging菜单 – > Windows中 – >输出,在VS2008中)生成的SQL。

在输出窗口中的“显示输出:”combobox应设置为“debugging” – VS2008自动为我做到了这一点。

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

一个警告的话 – 打开它可以大大减缓执行速度。