ASP.NET Entity Framework 擷取送入資料庫的指令

2022-08-25

說明如何擷取 EntityFarmework 對資料庫實際的查詢 Script,從而找到除錯與效能議題處理所需的資訊 😁

logo

說明

Interceptor

使用 EntityFramework 6,在 web.config 加入下列內容即可使用。可以在不需要變更程式碼與編譯程式碼的情況下使用,但只能將 Log 輸出至 Text File。

web.config

<entityFramework>
  <interceptors> 
    <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
      <parameters> 
        <parameter value="C:\Temp\EFLinqLog.txt"/> 
        <parameter value="true" type="System.Boolean"/> 
      </parameters> 
    </interceptor> 
  </interceptors>
</entityFramework>

接著就可以前往「C:\Temp\EFLinqLog.txt」 來確認原本經由 EntityFramework 轉換自 Linq 傳入往 SQL Server 轉換後的 T-SQL 究竟為何囉 😀

Intercept Database Command in Entity Framework

Entity Framework 6.1 Turning on logging without recompiling

DbContext.Database.Log

使用 DbContext 將 Log 訊息進行輸出。

using (var context = new NorthWindEntities())
{
    context.Database.Log = Console.WriteLine;
    
    var products = context.Products.Where(p => p.UnitPrice >= 50).ToList();
}

也可以自行設計 Logger 將 Log 寫入 Text File 或者是 Database。

CREATE TABLE dbo.Logs
	(
	Message nvarchar(1000) NULL,
	LogTimeStamp datetime NULL
	)  ON [PRIMARY]
GO

ALTER TABLE dbo.Logs ADD CONSTRAINT
	DF_Logs_LogTimeStamp DEFAULT (getDate()) FOR LogTimeStamp
GO

COMMIT

Logger.cs

public class Logger
{
  public static void Log(string message)
  {
    File.AppendAllText("Log.txt", message);

    var logContext = new LogEntittis();
    logContext.database.ExecuteSqlCommand(
      $"Insert Into Logs (message) Values ('{ message}')");
  }
}

Logging Database Commands in Entity Framework