Entity Framework Core (EF Core) で、実際にどのようなSQLが実行されるのかをログで確認する方法を解説します。
環境
- Visual Studio 2022
- .NET 8
前提
開発時(デバッグ時)に確認することを想定しています。
本番環境でSQLをログに出力したい場合は下記のドキュメントを参照してください。
EF Core での Microsoft.Extensions.Logging の使用
また、本記事で使用するサンプルコードは、下記記事で使用したコードをベースにしています。
お手元で再現してみたい場合は参考にしてください。
確認方法
実行されるSQLのログを確認するためには、DbContextクラスのOnConfiguringメソッド内でLogToメソッドを呼び出します。
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
namespace SQLServerCurdSample
{
internal class TodoContext : DbContext
{
public DbSet<Todo> Todos { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.LogTo(Console.WriteLine, LogLevel.Information, DbContextLoggerOptions.LocalTime)
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Todo;Trusted_Connection=True");
}
}
}
LogToメソッドの引数について簡単に解説します。
- 第1引数:メッセージを出力する場所を指定します。コンソールではなくデバッグウィンドウに出力したい場合は、
message => Debug.WriteLine(message)
などと指定します。 - 第2引数:出力するログのレベルを指定します。今回はSQLのみが確認できればいいので
Information
に設定しています。 - 第3引数:ログのタイトル部分の表示オプションを指定します。
LocalTime
を指定すると日時のみのシンプルな表示になります。
今回は必要最低限の引数にしましたが、他にも様々なオプションがあるので気になる方はドキュメントを参照してください。
シンプルなログ - EF Core
LogTo を使用した EF Core DbContext からのログ記録
learn.microsoft.com
※ちなみにProgram.csでAddDbContextをする場合でも、同様にLogToメソッドを呼び出せます。
builder.Services.AddDbContext<TodoContext>(
options => options.LogTo(Console.WriteLine).UseSqlServer("接続文字列"));
最後に、今回の設定でコードを動かしてログが出力されることを確認します。
// 全件取得
var todos = await context.Todos.ToListAsync();
// 全件削除
context.RemoveRange(todos);
await context.SaveChangesAsync();
EF Coreによって発行されたSQLがコンソールに表示されました。
【おすすめ書籍】
ポチップ