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