如何查看nHibernate生成的SQL?

Lar*_*rod 41 nhibernate

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

mat*_*ieu 42

您可以在app.config/web.config文件中放置类似的内容:

在configSections节点中:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
Run Code Online (Sandbox Code Playgroud)

在配置节点中:

<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>
Run Code Online (Sandbox Code Playgroud)

别忘了打电话

log4net.Config.XmlConfigurator.Configure();
Run Code Online (Sandbox Code Playgroud)

在您的应用程序启动时,或放置

[assembly: log4net.Config.XmlConfigurator(Watch=true)]
Run Code Online (Sandbox Code Playgroud)

在assemblyinfo.cs中

在配置设置中,将"show_sql"属性设置为true.

  • 配置设置?哪里是?想知道在哪里设置"show_sql". (4认同)

Ian*_*son 18

在配置设置中,将"show_sql"属性设置为true.这将导致SQL在NHibernate的日志文件中输出,由log4net提供.


Ale*_*der 12

我知道,我有点晚了,但这样做的伎俩是独立的工具/数据库/框架.我使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,只需在打开会话时传递实例.一定要在DEBUG中这样做:

public static void OpenSession() {

#if DEBUG
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput());

#else
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession();

#endif
}
Run Code Online (Sandbox Code Playgroud)

就是这样.

从现在开始,你的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();
Run Code Online (Sandbox Code Playgroud)

..在输出窗口中直接显示:

NH:从帖子post0_选择强制转换(count(*)为INT)为col_0_0_

NH:选择post0_.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_来自帖子post0_ order by post0_.created_at desc limit?抵消?

  • 这可以解决问题。我想补充一点,新的 API 是 `sessionFactory.WithOptions().Interceptor(new SQLDebugOutput()).OpenSession()`。这样,如果除此之外我们还有更多拦截器,我们可以简单地将它们链接到您的“Interceptor”之后。 (2认同)

Iai*_*der 6

使用sql server profiler.

编辑(1年后):正如@Toran Billups在下面所述,NHibernate剖析器Ayende所写的非常酷.


Tor*_*ups 5

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

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