記錄和攔截的概觀

Entity Framework Core (EF Core) 包含數種可用來產生記錄、回應事件,以及取得診斷的機制。 每一個機制都針對不同的情況量身打造,而且請務必為手上的工作選取最佳機制,即使有多個機制可用也一樣。 例如,資料庫攔截器可用來記錄 SQL,但這是最好使用其中一個專為記錄量身打造的機制來處理此工作。 此頁面提供每個機制的概觀,並說明何時應使用每個機制。

快速參考

下表提供此處所述機制之差異的快速參考。

機制 Async 範圍 已註冊 預定用途
簡單記錄 No 個別內容 上下文設定 開發時間記錄
Microsoft.Extensions.Logging No 個別內容* D.I. 或上下文設定 生產記錄
事件 No 個別內容 Any time 對 EF 事件做出反應
攔截器 Yes 個別內容 上下文設定 操作 EF 作業
診斷接聽程式 No 處理 全球 應用程式診斷

*通常會透過相依性插入針對個別應用程式設定 Microsoft.Extensions.Logging。 不過,在 EF 層級,您「可以」視需要使用不同的記錄器來設定每個上下文。

簡單記錄

設定 DbCoNtext 執行個體時,可以使用 LogTo 從任何類型的應用程式存取 EF Core 記錄。 此設定通常是在 DbContext.OnConfiguring 的覆寫中完成。 例如:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(Console.WriteLine);

此概念類似於 EF6 中的 Database.Log

如需詳細資訊,請參閱簡單記錄

Microsoft.Extensions.Logging

Microsoft.Extensions.Logging 是一種可延伸的記錄機制,其中包含許多常見記錄系統的外掛程式提供者。 EF Core 與 Microsoft.Extensions.Logging 完全整合,而且預設會針對 ASP.NET Core 應用程式使用這種記錄形式。

如需詳細資訊,請參閱在 EF Core 中使用 Microsoft.Extensions.Logging

事件

EF Core 會公開 .NET 事件,以做為當 EF Core 程式碼中發生特定事件時的回呼。 事件比攔截器簡單,而且允許更有彈性的註冊。 不過,它們只是同步處理,因此無法執行非封鎖非同步 I/O。

會針對每個 DbCoNtext 執行個體註冊事件,而且您隨時都可以完成此註冊。 使用診斷接聽程式來取得相同的資訊,但是是針對處理序中的所有 DbCoNtext 執行個體。

如需詳細資訊,請參閱 EF Core 中的 .NET 事件

攔截

EF Core 攔截器可啟用 EF Core 作業的攔截、修改和/或歸併。 這包括低階資料庫作業 (例如執行命令),以及較高層級的作業 (例如對 SaveChanges 的呼叫)。

攔截器與記錄和診斷不同,因為攔截器允許修改或隱藏正在攔截的作業。 簡單的記錄Microsoft.Extensions.Logging 是用於記錄的更好選擇。

設定上下文時,會針對每個 DbCoNtext 執行個體註冊攔截器。 使用診斷接聽程式來取得相同的資訊,但是是針對處理序中的所有 DbCoNtext 執行個體。

如需詳細資訊,請參閱攔截

診斷接聽程式

診斷接聽程式允許接聽目前 .NET 處理序中發生的任何 EF Core 事件。

診斷接聽程式不適合從單一 DbCoNtext 執行個體取得事件。 EF Core 攔截器可透過個別上下文註冊來存取相同的事件。

診斷接聽程式並非針對記錄而設計。 簡單的記錄Microsoft.Extensions.Logging 是用於記錄的更好選擇。

如需詳細資訊,請參閱在 EF Core 中使用診斷接聽程式