LINQ to SQL語句(16)之對象標識

作者: 李永京  來源: 博客園  發布時間: 2008-09-18 16:55  閱讀: 5599 次  推薦: 0   原文鏈接   [收藏]  
摘要:這個系列的第十六篇,講解對象標識。

系列文章導航:

LINQ to SQL語句(1)之Where

LINQ to SQL語句(2)之Select/Distinct

LINQ to SQL語句(3)之Count/Sum/Min/Max/Avg

LINQ to SQL語句(4)之Join

LINQ to SQL語句(5)之Order By

LINQ to SQL語句(6)之Group By/Having

LINQ to SQL語句(7)之Exists/In/Any/All/Contains

LINQ to SQL語句(8)之Concat/Union/Intersect/Except

LINQ to SQL語句(9)之Top/Bottom和Paging和SqlMethods

LINQ to SQL語句(10)之Insert

LINQ to SQL語句(11)之Update

LINQ to SQL語句(12)之Delete和使用Attach

LINQ to SQL語句(13)之開放式并發控制和事務

LINQ to SQL語句(14)之Null語義和DateTime

LINQ to SQL語句(15)之String

LINQ to SQL語句(16)之對象標識

LINQ to SQL語句(17)之對象加載

LINQ to SQL語句(18)之運算符轉換

LINQ to SQL語句(19)之ADO.NET與LINQ to SQL

LINQ to SQL語句(20)之存儲過程

LINQ to SQL語句(21)之用戶定義函數

LINQ to SQL語句(22)之DataContext

LINQ to SQL語句(23)之動態查詢

LINQ to SQL語句(24)之視圖

LINQ to SQL語句(25)之繼承

LINQ簡介

adsfsaf

 

對象標識

  • 運行庫中的對象具有唯一標識。引用同一對象的兩個變量實際上是引用此對象的同一實例。你更改一個變量后,可以通過另一個變量看到這些更改。
  • 關系數據庫表中的行不具有唯一標識。由于每一行都具有唯一的主鍵,因此任何兩行都不會共用同一鍵值。

實際上,通常我們是將數據從數據庫中提取出來放入另一層中,應用程序在該層對數據進行處理。這就是 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;
0
0
 
標簽:LINQ LINQ to SQL
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()