NHibernateによって生成されたSQLを表示するにはどうすればよいですか?バージョン1.2
このようなものを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に設定します。
構成設定で、「show_sql」プロパティーをtrueに設定します。これにより、SQLがlog4netの厚意によりNHibernateのログファイルに出力されます。
私は知っている少し遅いですが、これはトリックを行い、それはツール/ 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?オフセット?
SQLサーバープロファイラーを使用します。
編集(1年後):@Toran Billupsが以下に述べるように、NHibernateプロファイラーAyendeは非常にクールです。
NHibernate Profiler を試すこともできます(他に何もない場合は30日間のトライアル)。このツールは私見周りの最高です。
これは、生成されたSQLだけでなく、警告/提案なども表示します
Log4NetをNHibernateで使用するように構成する方法 に、NHibernateのロギングに関する適切なリファレンスがあります。これには、NHibernateで生成されたすべてのSQLステートメントのロギングに関する情報が含まれています。
Nhibernate Profiler は、深刻なことをする必要がある場合のオプションです。
SQL Server(Expressではない)を使用している場合は、SQL Server Profilerを試すことができます。