2016-11-10 21 views
0

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

基本コンテキストクラスを拡張し、別のメソッドを作成してDbSetを取得し、そこにラッパーを戻すことができますが、1)ハッキリしているはずです.2)コードがありません。私はコードを見てきた

...実際のデータベースアクセス対キャッシュされた結果を得て区別しExecutionStrategyFactoryまたはDatabaseが進むべき道である包むように感じる - と私は前者RelationalDbContextOptionsBuilderに拡張メソッドを作成する、またはすることができながら/ /サービスを置き換えると、いずれかのラッピング方法がわかりません。そのため、基本となるプロバイダの実装がまだ使用されています。

(参照:https://github.com/aspnet/EntityFramework/issues/6967)このにフックするためにまともな場所は

ありますか?他の誰の参照のために

答えて

1

[OK]を、トリックがある:

  1. EFコアのDIシステムはReplaceService<IRelationalConnection, MyRc>()を経由して使用することIRelationalConnectionを交換してください。新しいMyRcは、既存の接続をラップしてフックを追加します
  2. MyRcには、IDatabaseProviderServicesのコンストラクタパラメータがあります。 EF DIシステムがそれを入力します。 IRelationalDatabaseProviderServicesにそれをキャストして、ラップその
  3. からすべてのメソッドをRelationalConnection財産をつかむが、ラッピングクラスというでは公共DbConnection DbConnection { get; }リターン・DbConnection -wrappingクラス
  4. のインスタンスを持っている、DbCommandのインスタンスを返すCreateDbCommand()持っていますそのラッピングクラスの-wrappingクラス
  5. は、ExecuteDbDataReader()リターンDbDataReader -wrappingクラスのインスタンスを有する

次に、DbCommandおよびDbDataReaderラッパーでは、どのコマンドとパラメーターがデータベースに送信されているかを確認し、結果を戻します。

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

+0

そして、EFCore 2.0ではどうしていますか? IDatabaseProviderServicesに問題があります。私のVisual Studioはそれを見つけることができず、私はそれがもうそこにないと信じています。 –