質問: このブログ投稿に示されているように、古い(プレコア)時代のエンティティフレームワーク6には、スタックバックトレースを含むすべての低速クエリをログに記録できるインターセプターを構成する方法があります。 [注:Entity Framework Core 1.0 RC2では、これが尋ねられたとき、これは不可能だったと思います。この質問はもともと代わりに何をすべきかを尋ねました。この質問が行われたときから、EF COreの新しいオプションと新しいバージョンがリリースされました。この質問は現在、本質的に歴史的であり、後に追加された回答の一部は、インターコアが再導入された可能性のあるEF Coreの他の新しいバージョンを参照し、コア前の時代のエンティティフレームワークと同等の機能を実現します] EF7と呼ばれていた以前のベータに関する2015年の質問は、asp.net vnextの初期ベータではまだ可能ではなかったことを示唆しています。 それでも、EF Coreの設計全体は構成可能であり、 ここでのgithubバグトラッカーの議論では、 `SqlServerConnection`などの低レベルクラスをサブクラス化し、そこにあるメソッドをオーバーライドして、可能なポイントを取得する手法が可能になる可能性がありますクエリの実行前後にフックし、ミリ秒のタイマー値が実行された場合に低レベルのログを追加します。 それはまだ必要であり、EF Core 1.0.0-rc2-final(2016年6月現在)で唯一のテクニックですか?
回答: EFコアには、まだ "インターセプタ"または類似のライフサイクルフックはありません。この機能はhttps://github.com/aspnet/EntityFramework/issues/626で追跡されます 。 必要なものがすべてログ出力されている場合は、低レベルコンポーネントを無効にする必要はありません。多くの低レベルEFコアコンポーネントは、すでにクエリ実行を含むロギング、ロギングを生成しています。カスタムロガーファクトリを使用するようにEFを設定するには、 `DbContextOptionsBuilder.UseLoggerFactory(ILoggerFactory factory)`呼び出します。 (このロガーインタフェースの詳細については、 https ://docs.asp.net/en/latest/fundamentals/logging.htmlおよびを参照してください )。イベントIDを明確に定義します。 (参照`Microsoft.EntityFrameworkCore.Infrastructure.CoreLoggingEventId`ちょうどに改名された1.0.0-RC2、中`Microsoft.EntityFrameworkCore.Infrastructure.CoreEventId` 1.0.0 RTMのため。)を参照してくださいhttps://docs.efproject.net/en/latest/をこれを行う例はmiscellaneous / logging.htmlを参照してください。 EFコアコンポーネントがすでに生成しているものを超えて追加のログを必要とする場合は、EFコアの下位コンポーネントをオーバーライドする必要があります。これは、既存のコンポーネントを無効にすることによって最もよく行われ、依存性注入を介してこのオーバーライドバージョンをEFに追加しました。これを行うには、EFが内部で使用するカスタムサービスプロバイダを設定する必要があります。これは`DbContextOptionsBuilder.UseInternalServiceProvider(IServiceProvider services)`によって構成されます`DbContextOptionsBuilder.UseInternalServiceProvider(IServiceProvider services)`がサービスを内部的に使用する方法の詳細については、 https: `DbContextOptionsBuilder.UseInternalServiceProvider(IServiceProvider services)`参照してください 。