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

LINQ to SQL 物件身分識別管理:DataContext 快取與實例唯一性保證

     編輯:關於.NET

資料列 vs 物件身分

  • 資料庫資料列以主鍵唯一識別,同一資料列可被多次查詢產生多個資料列副本。
  • 記憶體中物件以參考唯一識別,同一實體在 DataContext 內永遠對應同一個物件實例。

DataContext 身分對應表

DataContext 內部維護身分表,以主鍵為鍵追蹤已載入實體。首次查詢建立物件並登記;後續查詢同一主鍵直接回傳快取實例,忽略資料庫最新值(除非呼叫 Refresh)。

實例驗證

相同查詢兩次

Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");
// cust1 與 cust2 參考同一實例
Console.WriteLine(Object.ReferenceEquals(cust1, cust2)); // True

不同查詢路徑取得同一實體

Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = (from o in db.Orders
                  where o.Customer.CustomerID == "BONAP"
                  select o).First().Customer;
// 雖查詢兩次資料庫,cust1 與 cust2 仍為同一實例

設計意圖

確保物件圖一致性、支援開放式並發控制:只有應用程式主動修改才會改變物件狀態,外部資料庫變更會在 SubmitChanges 時偵測衝突。

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