スポンサーリンク

EFCoreコードファーストが発行したSQLをログ出力する

.NET CoreASP.NET CoreBlazor Server 5.0C#Code firstEF CoreNLog

EFCoreコードファーストから発行されたSQLをログファイルに残す、サンプルを作りしました。コードファーストのDBパフォーマンスを、インデクス追加で改善する際には必須だと思う。
今回は今流行りの Blazor Server をベースに作成していますが、Blazor Server 以外でも同じです。
ソースコードはGitHubで公開しています。

EFCoreコードファーストから発行されたSQLは、Microsoftのログレベルを debugにすると出力されますが、DbContextの OnConfiguringメソッドを overrideすることでも出力できます。
Microsoftのログレベルを debugにして、コードファーストが発行したSQLをログ出力すると、発行したSQL以外のログが大量に出力されてしまう為、DbContextの OnConfiguringメソッドを overrideして、コードファーストが発行したSQLをログ出力する実装方式がお勧めです。

DbContextの OnConfiguringメソッドを overrideして、コードファーストが発行したSQLをログ出力した場合。ログファイルサイズは 2KB。

Microsoftのログレベルを debugにして、コードファーストが発行したSQLをログ出力した場合。ログファイルサイズは 31KB。

ソースコード構成

Blazor Server でログを出力する をベースに、EFCoreコードファーストから発行されたSQLをログファイルへ出力する処理だけ、追加実装しています。
追加変更を加えたソースファイル。

ソースコード変更内容を解説

/WebApplication1.csproj

・SqlServerを操作する為の、Microsoft.EntityFrameworkCore.SqlServer Nugetパッケージを追加。

/appsettings.Development.json

・SqlServerに接続する為の、接続文字列を追加。
 ローカルPCにインストールした SqlServerの TestDBへ、ID/PW認証で接続しています。

/Startup.cs

・各画面で、DbContextからコードファーストで SQLServerを操作できるようにする為、起動処理に コネクションストリングを使用して DbContextを初期化する処理を追加。

/Model/DB/TableA.cs

・SQLServer TestDB上のテストテーブルに対応する、Modelクラスを作成。

/Data/ApplicationDbContext.cs

・DbContextのクラスを作成。
・コンストラクタで、Loggerのインスタンスを作成。
・OnConfiguringをオーバライドして、コードファーストのログを、ログファイルへ出力する共通メソッドへ送っている。
・Modelクラスの DbSetを設けている。

/Helpers/CodeFirstHelper.cs

・コードファイルのログの内、発行された SQLだけログファイルへ出力する共通メソッドを作成。
 static化することで高速化している。
・Debugレベルのログは、他製品のログが大量に出力される為、SQL実行ログ(ビジネスロジックのログ)は、Informationレベルで出力している。
・Debug実行時は、ログファイルだけではなく、Debug.WriteLineから Visual Studioの「出力」ウィンドウへ SQL実行ログが出力されるようにし、開発生産性を上げている。

/_Imports.razor

・各Razorページで、DbContextを使ったコードファースト処理を実装できるよう、共通部品に Usingを追加。

/Pages/Counter.razor

・Razorページにコードファースト処理を追加。

コメント

タイトルとURLをコピーしました