なか日記

一度きりの人生、楽しく生きよう。

EntityFrameworkで発行されているSQLを確認する方法

EntityFrameworkを使用するとSQLをいいように発行してくれるので、SQLをあまり意識しなくて済むようになります。

でも、どんなSQLが発行されているのか気になることがありますよね。

そんな時にSQLを確認する方法を2つ書いておきます。

方法1:DbContext.Database.Logプロパティを使用する

DbContext の Database.Log プロパティを使用すると、発行しているSQLをログ出力できるようになります。

例えば、以下のサンプルのようにデリゲートを書いてあげると、Visual Studioの出力ウィンドウにSQLが出力されるようになります。

f:id:nakaji999:20141210030143p:plain

サンプル

public class AppDbContext : DbContext
{
    public DbSet<Article> Articles { get; set; }
}

public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Contents { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<AppDbContext>());

        var db = new AppDbContext();
        
        // デバッグ出力にSQLを出力する
        db.Database.Log = sql => { Debug.Write(sql); };

        var article = new Article() { Title = "タイトル", Contents = "本文"};
        db.Articles.Add(article);
        db.SaveChanges();
    }
}

出力結果

こんな感じに出力されます。

Opened connection at 2014/12/10 2:53:09 +09:00
Started transaction at 2014/12/10 2:53:09 +09:00
CREATE TABLE [dbo].[Articles] (
    [Id] [int] NOT NULL IDENTITY,
    [Title] [nvarchar](max),
    [Contents] [nvarchar](max),
    CONSTRAINT [PK_dbo.Articles] PRIMARY KEY ([Id])
)
-- Executing at 2014/12/10 2:53:09 +09:00
-- Completed in 41 ms with result: -1

Committed transaction at 2014/12/10 2:53:09 +09:00

Opened connection at 2014/12/10 2:53:09 +09:00
Started transaction at 2014/12/10 2:53:09 +09:00
INSERT [dbo].[Articles]([Title], [Contents])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[Articles]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
-- @0: 'タイトル' (Type = String, Size = -1)
-- @1: '本文' (Type = String, Size = -1)
-- Executing at 2014/12/10 2:53:09 +09:00
-- Completed in 13 ms with result: SqlDataReader

Committed transaction at 2014/12/10 2:53:09 +09:00
Closed connection at 2014/12/10 2:53:09 +09:00

方法2:SQL Server Profilerを使用する

方法1はソースを弄る必要があるので、本番稼働している場合などはちょっと難しいかもしれません。

そんな時は SQL Server Profiler を使用すればいいと思います。もちろん、データベースに SQL Server を使っている場合のみの方法です。ちなみに、ローカルDBを使用している場合でも使えます。

接続

SQL Server Profiler して SQL Server へ接続します。

f:id:nakaji999:20141210031716p:plain

ローカルDBの場合はサーバ名の所に「(LocalDb)\v11.0」と入力します*1

トレースの設定

「全般」タブはデフォルトのままにしておきます。 f:id:nakaji999:20141210031259p:plain 「イベントの選択」タブでは不要な情報が出力されないよう、「RPC:Completed」と「SQL:BatchCompleted」だけチェックしておきます。 f:id:nakaji999:20141210031303p:plain

処理を実行して確認

処理を実行すると以下のように発行されたSQLを見ることができます。 f:id:nakaji999:20141210031306p:plain

*1:バージョンに合わせて変更が必要