nHibernateによって生成されたSQLを表示するにはどうすればよいですか?バージョン1.2
10 に答える
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 に設定します。
私は知っている少し遅れていますが、これはトリックを行い、ツール/データベース/フレームワークに依存しません。これらの有効なオプションの代わりに、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_ から cast(count(*) as INT) as col_0_0_ を選択
NH: Id3_ として post0_.Id、user2_3_ として post0_.user_id、Title3_ として post0_.Title、Slug3_ として post0_.Slug、Content3_ として post0_.Content、created6_3_ として post0_.created_at、updated7_3_ として post0_.updated_at、post0_.deleted_at として deleted8_3_ として post0_.Id を選択します。投稿から post0_ order by post0_.created_at des limit ? オフセット?
構成設定で、「show_sql」プロパティをtrueに設定します。これにより、log4netのおかげでSQLがNHibernateのログファイルに出力されます。
SQLサーバープロファイラーを使用します。
編集(1年後):@ Toran Billupsが以下に述べているように、NHibernateプロファイラーAyendeは非常にクールです。
NHibernate のロギングについては、How to configure Log4Net for use with NHibernate に参考文献があります。NHibernate によって生成されたすべての SQL ステートメントのログ記録に関する情報が含まれています。
SQL Server (Express ではない) を使用している場合は、SQL Server Profiler を試すことができます。