Entity FrameworkでSQLのログを出すメモ

Entity FrameworkとLINQ、便利なんですけどね。

cakephpのときもそうなんですけど、フレームワークはてきぱきやってくれるのは大変いいのですが、ふとSQLクエリを確認したいときありますよね。

「生で書けばいいじゃない」

せ、せやな!

…でもそれ言ったらおしまいじゃない?

ASP.netでも実際にSQLクエリ正しく発行しているのか確認したいわけですよ。

疑り深いのです、ワタシ。

ちょこっとしたことでできたのでメモです。

こんなプロパティがあるんです。

ようするにDbContextクラスにDatabaseというインスタンスのプロパティがあって、

そいつに「Log」というプロパティがあるんです。以上です。

ちょっと調べればわかるんですよね…よくできてるなあ。

Logプロパティは、Action<T>型なのでラムダで処理かいて終わり。

任意のファイルに出力します。

var context = new SampleEntities();
context.Database.Log = (log) =>
{
  // 追記モードでオープン
  using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"<出力先のパス>\SQL_LOG.txt", true))
 {
    // 書き込み
    file.WriteLine(log);
  }
};

適時仕込んでもいいけど、プリプロセッサで

#if DEBUG
context.Database.Log = (log) =>
{
  ・・・・・
}
#endif

デバッグ中は確認します。※”DEBUG”をビルドのオプションで定数にセットしているのが前提

出力内容は以下の感じ。

 

2016/06/29 13:23:45 +09:00
 で接続を開きました
2016/06/29 13:23:45 +09:00
 でトランザクションを開始しました
UPDATE [dbo].[XXXXXXXXXX]
SET [datetime] = @0
WHERE ([id] = @1)

-- @0: '2016/06/29 13:23:45' (Type = DateTime2)

-- @1: '1378' (Type = Int64)

-- 2016/06/29 13:23:45 +09:00
 で実行しています
-- 1 ミリ秒で完了しました。結果: 1



2016/06/29 13:23:45 +09:00
 でトランザクションをコミットしました
2016/06/29 13:23:45 +09:00
 で接続を閉じました

…内容がうざい。とかは言わない。とにかく目的を達したのである。

まとめ

これは便利だ。

自分のような猜疑心の強い古臭いおっさんにはこういうツールが必要だ。

cakephp3のDbugKitみたいなログ出力ほしかったのでね。

まあ複雑な内容のSQLクエリの場合はさすがに「SqlQuery()」で流すけどね。

なにごとも基本熟知しているうえで使用することが望ましい素敵ツールです。(ドヤ