web-dev-qa-db-ja.com

EF Core 2.0で基礎となるSQLクエリをどのように表示しますか?

この「 。NET Core 2.0リリース! 」ビデオの終わりから3:15に、Diego VegaはEntity Framework Core 2.0の新機能のデモを示しています。その一部として、基礎となるSQLのダンプがコンソールアプリに表示されます。

enter image description here

Stack Overflowで多くの回答を見てきましたが、SQLプロファイラーを使用して基になるクエリを表示することを示唆しています。しかし今、私は興味があります。DiegoVegaが行ったことをどのように実行し、クエリをアプリケーションに表示することができますか?

23
Gigi

https://docs.Microsoft.com/en-us/ef/core/miscellaneous/logging

DbContextのOnConfiguringメソッドでは、ロガーを設定できます。ログインコンソールは事前定義されたタイプであり、単に this NuGet を使用します。ロガーインスタンスのファクトリパターンの使用がベストプラクティスであることに注意してください。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
12

こんにちは、次のようにして、Entity Framework Coreが生成したSQLコードを出力ウィンドウに表示できます。 DbContextクラスで:

public static readonly Microsoft.Extensions.Logging.LoggerFactory _myLoggerFactory = 
new LoggerFactory(new[] { 
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() 
});

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLoggerFactory(_myLoggerFactory);
}

デバッグロガーは、デバッガーが接続されている場合にのみ、デバッグ出力ウィンドウにメッセージを書き込みます。

以下を実行する必要があります。

  • microsoft.Extensions.Loggingを使用します。
  • Nugetパッケージのインストール:Microsoft.Extensions.Logging.Debug
33
Mohammad

私は受け入れられた答えがうまくいくと確信していますが、DIを使用してこれを行う方法を知りたいので...

private readonly ILoggerFactory loggerFactory;  

public MyDataContext(DbContextOptions<MyDataContext> options, ILoggerFactory loggerFactory)
        : base(options)
{
    this.loggerFactory = loggerFactory;
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  
{
    // Allow null if you are using an IDesignTimeDbContextFactory
    if (loggerFactory != null)
    { 
        if (Debugger.IsAttached)
        {
            // Probably shouldn't log sql statements in production
            optionsBuilder.UseLoggerFactory(this.loggerFactory); 
        }
    }
} 
1
rstackhouse

ASP.NET Core MVCフレームワークに基づいてAPIまたはAppサービスを作成している場合は、Startup.csこのようなクラス

public void ConfigureServices(IServiceCollection services)
{
    ...

    Action<DbContextOptionsBuilder> dbOptionsContextBuilder = builder => 
        {
        builder.UseSqlServer(Configuration.DbConnection)  // Configuration.DbConnection is the db connection string
               .UseLoggerFactory(ConsoleLoggerFactory);   // Logs out SQL
        };

    services.AddDbContext<YourDatabaseContext>(dbOptionsContextBuilder);


    ...
}

ここで、ConsoleLoggerFactoryは以前に次のように定義されています。

private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });
0
Peter