我如何查看由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。