EFコアによるデータベースへのアクセスを傍受する

entity-framework-core

質問

私はいくつかの詳細なパフォーマンス統計を取得する手段としてデータベースクエリをインターセプトする方法を探しています。私は、クエリの数、クエリの継続時間、結果のデータ(データの大きさの考え方)、理想的にはLINQの式へのアクセスの後にいます。

私は、ベースコンテキストクラスを拡張し、 DbSetを取得する別のメソッドを作成してそこにラッパーを返すことに戻すことができますが、1)ハッキーに見えるよりも、2)キャッシュされた結果を区別できない実際のデータベースへのアクセス

私はコードを見て、 ExecutionStrategyFactoryDatabaseラップするように感じました。そして、 RelationalDbContextOptionsBuilder拡張メソッド、または/ replace / servicesを作成することはできますが、どちらのラッピング方法も見えません基礎となるプロバイダの実装が引き続き使用されるようにします。

(関連項目: https : //github.com/aspnet/EntityFramework/issues/6967

これにぴったりの場所はありますか?

受け入れられた回答

他の誰かを参照してください:

さて、トリックです:

  1. ReplaceService<IRelationalConnection, MyRc>()を介してEF CoreのDIシステムが使用するIRelationalConnectionを置き換えます。新しいMyRcは既存の接続をラップしてフックを追加します
  2. 私たちのMyRcには、 MyRcのコンストラクタパラメータがIDatabaseProviderServicesます。 EF DIシステムがそれを入力します。それをIRelationalDatabaseProviderServicesキャストし、 RelationalConnectionプロパティを取得します
  3. すべてのメソッドをラップしますが、公開されていますDbConnection DbConnection { get; } DbConnection -wrappingクラスのインスタンスを返す
  4. そのラッピングクラスでは、 CreateDbCommand() DbCommand -wrappingクラスのインスタンスを返します
  5. その包装クラスにおいて、有するExecuteDbDataReader()のインスタンスを返すDbDataReader -wrappingクラス

すると、中にDbCommandDbDataReaderラッパー、私たちは、コマンドとパラメータは、データベースに送信されている、との結果が戻ってくるかを見ることができます。

これは、リレーショナル・モデルでのみ機能します。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ