我如何查看由nHibernate生成的SQL?

我如何查看由nHibernate生成的SQL? 版本1.2

你可以把这样的东西放在你的app.config / web.config文件中:

在configSections节点中:

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

在configuration节点中:

 <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中

在configuration设置中,将“show_sql”属性设置为true。

在configuration设置中,将“show_sql”属性设置为true。 这将导致SQL在NHibernate的日志文件中log4net输出。

使用sql server分析器。

编辑(1年后):正如@Toran Billups所述,NHibernate的profileer Ayende写的非常非常酷。

你也可以试试NHibernate Profiler (如果没有其他的话,30天试用版)。 这个工具是最好的,恕我直言。

这不仅会显示生成的SQL,还会显示警告/build议等

我知道我有点迟了,但是这个技巧,它是独立的工具/数据库/框架。 而不是那些有效的选项,我使用NH拦截器 。

首先,实现一个扩展了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); } } } 

然后,在打开会话时传递一个实例。 一定要在debugging时才能做到这一点:

 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:从post0后面selectcast(count(*)as INT)作为col_0_0_

NH:selectpost0_.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为deleted8_3_来自postpost0_ order by post0_.created_at desc limit? 抵消?

NHibernate的日志logging有一个很好的参考: 如何configurationLog4Net与NHibernate一起使用 。 它包含有关logging所有NHibernate生成的SQL语句的信息。

Nhibernate分析器是一个选项,如果你必须做任何严肃的事情。

如果您使用SQL Server(不是Express),则可以尝试SQL Server Profiler。