前回の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ログを確認するにはこれだけの情報で十分ではないでしょうか?
もちろん本番環境では上記の処理は不要なので、出力処理が実行されないよう注意しましょう。