使用EF Core攔截數據庫訪問

entity-framework-core

我正在尋找一種攔截數據庫查詢的方法,作為獲取更深入的性能統計數據的一種方法。我經歷了多次查詢,查詢持續時間,結果數據(對於數據量級的想法)以及理想情況下對任何LINQ表達式的一些訪問。

我可以回退擴展一個基礎上下文類,創建另一個獲取DbSet方法,在DbSet返回一個包裝器,但是1)看起來比應該的更糟糕,2)任何代碼都無法區分獲取緩存的結果vs實際的數據庫訪問..

我查看了代碼並感覺像包裝ExecutionStrategyFactoryDatabase是要走的路 - 雖然我可以在RelationalDbContextOptionsBuilder為前者或/ replace / services創建一個擴展方法,但是我看不到包裝的方式,這樣仍然使用了底層提供者的實現。

(另見: https//github.com/aspnet/EntityFramework/issues/6967

有沒有一個像這樣的好地方?

一般承認的答案

對於任何其他人的參考:

好的,訣竅是:

  1. 更換IRelationalConnection該EF核心的DI系統通過使用ReplaceService<IRelationalConnection, MyRc>()我們的新MyRc將包裝現有連接以添加鉤子
  2. 在我們MyRc ,有一個構造函數PARAM IDatabaseProviderServices 。 EF DI系統將填充它。將其轉換為IRelationalDatabaseProviderServices ,然後IRelationalDatabaseProviderServices獲取RelationalConnection屬性
  3. 包裝所有方法,但有公共DbConnection DbConnection { get; }返回的實例DbConnection ,計量類
  4. 包裝類中,讓CreateDbCommand()返回一個DbCommand CreateDbCommand()類的實例
  5. 包裝類中,讓ExecuteDbDataReader()返回一個DbDataReader -wrapping類的實例

然後,在DbCommandDbDataReader包裝器中,​​我們可以看到正在向數據庫發送哪些命令和參數,以及返回的結果。

這僅適用於關係模型。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow