對象標識
- 運行庫中的對象具有唯一標識。引用同一對象的兩個變量實際上是引用此對象的同一實例。你更改一個變量后,可以通過另一個變量看到這些更改。
- 關系數據庫表中的行不具有唯一標識。由于每一行都具有唯一的主鍵,因此任何兩行都不會共用同一鍵值。
實際上,通常我們是將數據從數據庫中提取出來放入另一層中,應用程序在該層對數據進行處理。這就是 LINQ to SQL 支持的模型。將數據作為行從數據庫中提取出來時,你不期望表示相同數據的兩行實際上對應于相同的行實例。如果您查詢特定客戶兩次,您將獲得兩行數據。每一行包含相同的信息。
對于對象。你期望在你反復向 DataContext 索取相同的信息時,它實際上會為你提供同一對象實例。你將它們設計為層次結構或關系圖。你希望像檢索實物一樣檢索它們,而不希望僅僅因為你多次索要同一內容而收到大量的復制實例。
在 LINQ to SQL 中,DataContext 管理對象標識。只要你從數據庫中檢索新行,該行就會由其主鍵記錄到標識表中,并且會創建一個新的對象。只要您檢索該行,就會將原始對象實例傳遞回應用程序。通過這種方式,DataContext 將數據庫看到的標識(即主鍵)的概念轉換成相應語言看到的標識(即實例)的概念。應用程序只看到處于第一次檢索時的狀態的對象。新數據如果不同,則會被丟棄。
LINQ to SQL 使用此方法來管理本地對象的完整性,以支持開放式更新。由于在最初創建對象后唯一發生的更改是由應用程序做出的,因此應用程序的意向是很明確的。如果在中間階段外部某一方做了更改,則在調用 SubmitChanges() 時會識別出這些更改。
以上來自MSDN,的確,看了有點“正規”,下面我用兩個例子說明一下。
對象緩存
在第一個示例中,如果我們執行同一查詢兩次,則每次都會收到對內存中同一對象的引用。很明顯,cust1和cust2是同一個對象引用。
Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP"); Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");
下面的示例中,如果您執行返回數據庫中同一行的不同查詢,則您每次都會收到對內存中同一對象的引用。cust1和cust2是同一個對象引用,但是數據庫查詢了兩次。
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;
文章列表