web-dev-qa-db-ja.com

nHibernateによって生成されたSQLを表示するにはどうすればよいですか?

NHibernateによって生成されたSQLを表示するにはどうすればよいですか?バージョン1.2

42
Larry Foulkrod

このようなものをapp.config/web.configファイルに入れることができます:

configSectionsノード:

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

構成ノード:

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

構成設定で、「show_sql」プロパティーをtrueに設定します。

42
mathieu

構成設定で、「show_sql」プロパティーをtrueに設定します。これにより、SQLがlog4netの厚意によりNHibernateのログファイルに出力されます。

18
Ian Nelson

私は知っている少し遅いですが、これはトリックを行い、それはツール/ db /フレームワークに依存しません。これらの有効なオプションの代わりに、私は NH Interceptors を使用します。

最初に、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);
        }
    }
}

次に、セッションを開くときにインスタンスを渡します。 DEBUGの場合にのみ実行してください。

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_からcol_0_0_としてcast(count(*)as INT)を選択します

NH:select post0_.Id as Id3_、post0_.user_id as user2_3_、post0_.Title as Title3_、post0_.Slug as Slug3_、post0_.Content as Content3_、post0_.created_at as created6_3_、post0_.updated_at as updated7_3_、deleted_3_deleted_3_deleted_3_deleted_3_delete_8投稿からpost0_ order by post0_.created_at desc limit?オフセット?

13
Alexander

SQLサーバープロファイラーを使用します。

編集(1年後):@Toran Billupsが以下に述べるように、NHibernateプロファイラーAyendeは非常にクールです。

6
Iain Holder

NHibernate Profiler を試すこともできます(他に何もない場合は30日間のトライアル)。このツールは私見周りの最高です。

これは、生成されたSQLだけでなく、警告/提案なども表示します

5
Toran Billups

Log4NetをNHibernateで使用するように構成する方法 に、NHibernateのロギングに関する適切なリファレンスがあります。これには、NHibernateで生成されたすべてのSQLステートメントのロギングに関する情報が含まれています。

3
Sean Carpenter

Nhibernate Profiler は、深刻なことをする必要がある場合のオプションです。

1
Dan

SQL Server(Expressではない)を使用している場合は、SQL Server Profilerを試すことができます。

1
Big McLargeHuge