つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

Entity FrameworkのSQLログを出力する

前回のLINQ to Entitiesに関する記事の中で、Entity Frameworkが発行するSQLについて確認しました。
今回はEntity FrameworkのSQLログを出力する方法を紹介します。

tsubalog.hatenablog.com

Entity Frameworkで扱うデータベースを管理するクラスとしてSystem.Data.Entity.DbContextクラスがあります。
DbContextクラスにはDatabaseプロパティが定義されています。これがデータベースのインスタンスとなります。
このDatabaseプロパティのLogプロパティにSQLログを出力する処理を定義します。

それぞれのMSDNリファレンスはこちらです。

Logプロパティの型はAction<string>なので、デリゲートまたはラムダ式を指定することになります。

以下は前回の記事で使用したクラスを基にしたサンプルです。

public class TsubalogWebContext : DbContext
{
    public DbSet<Book> Books { get; set; }
}

public class TsubalogWebRepository
{
    private TsubalogWebContext db = new TsubalogWebContext();

    public TsubalogWebRepository()
    {
        //SQLログを出力する
        db.Database.Log = (log) => System.Diagnostics.Debug.WriteLine(log);
    }
}

このように記述することでEntity Frameworkが発行するSQLログを出力することができます。
出力されるログには以下の情報が含まれています。

  • 処理開始時間
  • 処理内容
  • 発行したSQL
  • SQL文の処理時間

以下はログのサンプルです。

2015/07/05 12:43:32 +09:00
 で接続を開きました
2015/07/05 12:43:32 +09:00
 でトランザクションを開始しました
CREATE TABLE [dbo].[Books] (
    [Id] [int] NOT NULL IDENTITY,
    [Title] [nvarchar](max),
    [Price] [int] NOT NULL,
    CONSTRAINT [PK_dbo.Books] PRIMARY KEY ([Id])
)


-- 2015/07/05 12:43:32 +09:00
 で実行しています
-- 76 ミリ秒で完了しました。結果: -1



2015/07/05 12:43:32 +09:00
 で接続を開きました
SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Title] AS [Title], 
    [Extent1].[Price] AS [Price]
    FROM [dbo].[Books] AS [Extent1]
    WHERE [Extent1].[Price] < 1000


-- 2015/07/05 12:43:33 +09:00
 で実行しています
-- 23 ミリ秒で完了しました。結果: SqlDataReader



2015/07/05 12:43:33 +09:00
 で接続を閉じました

開発中にSQLログを確認するにはこれだけの情報で十分ではないでしょうか?
もちろん本番環境では上記の処理は不要なので、出力処理が実行されないよう注意しましょう。