私はいくつかの詳細なパフォーマンス統計を取得する手段としてデータベースクエリをインターセプトする方法を探しています。私は、クエリの数、クエリの継続時間、結果のデータ(データの大きさの考え方)、理想的にはLINQの式へのアクセスの後にいます。
私は、ベースコンテキストクラスを拡張し、 DbSet
を取得する別のメソッドを作成してそこにラッパーを返すことに戻すことができますが、1)ハッキーに見えるよりも、2)キャッシュされた結果を区別できない実際のデータベースへのアクセス
私はコードを見て、 ExecutionStrategyFactory
やDatabase
ラップするように感じました。そして、 RelationalDbContextOptionsBuilder
拡張メソッド、または/ replace / servicesを作成することはできますが、どちらのラッピング方法も見えません基礎となるプロバイダの実装が引き続き使用されるようにします。
(関連項目: https : //github.com/aspnet/EntityFramework/issues/6967 )
これにぴったりの場所はありますか?
他の誰かを参照してください:
さて、トリックです:
ReplaceService<IRelationalConnection, MyRc>()
を介してEF CoreのDIシステムが使用するIRelationalConnection
を置き換えます。新しいMyRc
は既存の接続をラップしてフックを追加しますMyRc
には、 MyRc
のコンストラクタパラメータがIDatabaseProviderServices
ます。 EF DIシステムがそれを入力します。それをIRelationalDatabaseProviderServices
キャストし、 RelationalConnection
プロパティを取得しますDbConnection DbConnection { get; }
DbConnection
-wrappingクラスのインスタンスを返すCreateDbCommand()
DbCommand
-wrappingクラスのインスタンスを返しますExecuteDbDataReader()
のインスタンスを返すDbDataReader
-wrappingクラスすると、中にDbCommand
とDbDataReader
ラッパー、私たちは、コマンドとパラメータは、データベースに送信されている、との結果が戻ってくるかを見ることができます。
これは、リレーショナル・モデルでのみ機能します。