首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 物件生命週期管理:身分識別快取與變更追蹤機制

     編輯:關於.NET

LINQ to SQL 為實現高效查詢與更新,內建兩大核心服務:物件身分識別快取 與 變更追蹤。理解這兩項機制有助於撰寫高效能 LINQ 程式碼,並為擴充功能提供參考依據。

物件身分識別快取

同一個 DataContext 內重複查詢相同主鍵資料時,LINQ 會優先從快取返回物件參考,避免重複對應。實測 Northwind Customers 表前 100 筆:

// 第一次查詢:1058 ms(含資料庫連線、對應)
// 第二次查詢:3 ms(直接從快取取得物件參考)

關鍵點:

  • 快取鍵值為 Primary Key,故實體類別必須定義至少一個 IsPrimaryKey=true 的 Column
  • 同一 DataContext 內相同主鍵查詢返回同一物件實例(customerA == customerB // true)
  • 避免同一上下文內 SubmitChanges 時發生樂觀並發衝突

變更追蹤

查詢返回物件前,DataContext 保存一份物件複本(原始值)。屬性修改時透過追蹤機制記錄變更,SubmitChanges 產生精準 SQL:

UPDATE [Products] SET [ProductName] = @p9
WHERE ([ProductID] = @p0) AND ([ProductName] = @p1) ... -- 僅更新異動欄位,WHERE 條件含原始值實現並發檢測

運作原理:

  1. 查詢時建立物件快照(原始值)
  2. 屬性設定時觸發 PropertyChanging/Changed 事件記錄異動
  3. 提交時比對目前值與原始值,產生最小化 UPDATE 陳述式

效能調整建議

查詢顯示為主的場景可關閉兩項服務提升效能:

context.ObjectTrackingEnabled = false;      // 關閉身分識別快取與變更追蹤
context.DeferredLoadingEnabled = false;     // 關閉延遲載入

注意:ObjectTrackingEnabled=false 時自動禁用延遲載入。實際專案效能差異視資料量與查詢複雜度而定,建議實測比對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved