ASP.NET Entity Framework 擷取送入資料庫的指令
2022-08-25
說明如何擷取 EntityFarmework 對資料庫實際的查詢 Script,從而找到除錯與效能議題處理所需的資訊 😁
說明
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}')");
}
}