EntityFrameworkを使用するとSQLをいいように発行してくれるので、SQLをあまり意識しなくて済むようになります。
でも、どんなSQLが発行されているのか気になることがありますよね。
そんな時にSQLを確認する方法を2つ書いておきます。
方法1:DbContext.Database.Logプロパティを使用する
DbContext の Database.Log プロパティを使用すると、発行しているSQLをログ出力できるようになります。
例えば、以下のサンプルのようにデリゲートを書いてあげると、Visual Studioの出力ウィンドウにSQLが出力されるようになります。
サンプル
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 へ接続します。
ローカルDBの場合はサーバ名の所に「(LocalDb)\v11.0」と入力します*1。
トレースの設定
「全般」タブはデフォルトのままにしておきます。 「イベントの選択」タブでは不要な情報が出力されないよう、「RPC:Completed」と「SQL:BatchCompleted」だけチェックしておきます。
処理を実行して確認
処理を実行すると以下のように発行されたSQLを見ることができます。
*1:バージョンに合わせて変更が必要