前回のLINQ to Entitiesに関する記事の中で、Entity Frameworkが発行するSQLについて確認しました。
今回はEntity FrameworkのSQLログを出力する方法を紹介します。
Entity Frameworkで扱うデータベースを管理するクラスとしてSystem.Data.Entity.DbContextクラスがあります。
DbContextクラスにはDatabaseプロパティが定義されています。これがデータベースのインスタンスとなります。
このDatabaseプロパティのLogプロパティにSQLログを出力する処理を定義します。
それぞれのMSDNリファレンスはこちらです。
- DbContext クラス (System.Data.Entity)
- DbContext.Database プロパティ (System.Data.Entity)
- Database.Log プロパティ (System.Data.Entity)
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ログを出力することができます。
出力されるログには以下の情報が含まれています。
以下はログのサンプルです。
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ログを確認するにはこれだけの情報で十分ではないでしょうか?
もちろん本番環境では上記の処理は不要なので、出力処理が実行されないよう注意しましょう。