web-dev-qa-db-ja.com

Entity Framework DbContextによって実行されたログクエリ

MVC 5プロジェクトでLINQでEF 6.0を使用しています。デバッグ/パフォーマンス測定のために、Entity Framework DbContextによって実行されたすべてのSQLクエリをログに記録します。

Java/Hibernateでは、プロパティhibernate.show_sql=trueを設定することで同等の動作を実現できます。 Entity Frameworkで同様の動作をすることは可能ですか?

31
PC.

データベース操作のログ記録とインターセプト MSDNの記事はあなたが探しているものです。

DbContext.Database.Logプロパティは、文字列を取る任意のメソッドのデリゲートに設定できます。最も一般的には、TextWriterの「Write」メソッドに設定することにより、任意のTextWriterで使用されます。現在のコンテキストによって生成されたすべてのSQLは、そのライターに記録されます。たとえば、次のコードはSQLをコンソールに記録します。

using (var context = new BlogContext())
{
    context.Database.Log = Console.Write;

    // Your code here...
}
54
Andrew

この行を使用して、コンソールウィンドウではなく、「出力」ウィンドウにのみログを記録できます。これもデバッグモードでのみです。

public class YourContext : DbContext
{   
    public YourContext()
    {
        Database.Log = sql => Debug.Write(sql);
    }
}
29
Dennis Mieszala

ロガーを備えた.NET Coreセットアップを持っている場合、EFは、デバッグ出力ウィンドウ、コンソール、ファイルなど、必要な出力にクエリを記録します。

アプリケーション設定で「情報」ログレベルを設定するだけです。たとえば、これにはデバッグ出力ウィンドウへのEFロギングがあります:

"Logging": {
  "PathFormat": "Logs/log-{Date}.txt",
  "IncludeScopes": false,
  "Debug": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Console": {
    "LogLevel": {
      "Default": "Information",
      "System": "Warning",
      "Microsoft": "Warning"
    }
  },
  "File": {
    "LogLevel": {
      "Default": "Information",
      "System": "Warning",
      "Microsoft": "Warning"
    }
  },
  "LogLevel": {
    "Default": "Information",
    "System": "Warning",
    "Microsoft": "Warning"
  }
}
2
Jay