共用方式為


對象識別

運行時間中的物件具有唯一的身分識別。 參考相同物件的兩個變數實際上會參考物件的相同實例。 由於這個事實,透過一個變數的路徑所做的變更會立即透過另一個變數顯示。

關係資料庫數據表中的數據列沒有唯一的身分識別。 因為每個數據列都有唯一的主鍵,因此沒有兩個數據列共用相同的索引鍵值。 不過,這個事實只會限制資料庫數據表的內容。

實際上,數據通常從資料庫中帶出來並送到另一個層級,其中應用程式會處理這些數據。 這是 LINQ to SQL 支援的模型。 當數據以數據列的形式從資料庫取出時,您並不期望兩個代表相同數據的數據列實際上對應至相同的數據列實例。 如果您查詢特定客戶兩次,您會取得兩個數據列。 每個數據列都包含相同的資訊。

對於物件,您預期會有非常不同的事情。 您預期,如果您重複要求 DataContext 相同的資訊,它實際上會為您提供相同的物件實例。 您會預期此行為,因為對象對於您的應用程式具有特殊意義,而且預期它們的行為會像對象一樣。 您將其設計為階層或圖形。 您期望能夠如實取得這些內容,而不是因為多次請求相同的東西而收到大量重複的副本。

在 LINQ to SQL 中 DataContext ,會管理對象識別。 每當您從資料庫擷取新的數據列時,數據列就會以其主鍵記錄在標識表中,並建立新的物件。 每當您擷取相同的數據列時,原始物件實例就會傳回給應用程式。 如此一來, DataContext 會將資料庫所見的身分識別概念(也就是主鍵)轉譯為語言所見的身分識別概念(也就是實例)。 應用程式只會看到對象處於第一次擷取的狀態。 如果新數據有差異,則會被捨棄。 如需詳細資訊,請參閱 從識別快取擷取物件

LINQ to SQL 會使用此方法來保護本機物件的完整性,以支持樂觀更新。 因為第一次建立對象之後發生的唯一變更是應用程式所做的變更,因此應用程式的意圖是清楚的。 如果外部方變更是在期間內發生,則會在呼叫SubmitChanges()時加以識別。

備註

如果查詢所要求的物件很容易識別為已經擷取的物件,則不會執行任何查詢。 識別數據表可作為所有先前擷取物件的快取。

範例

物件快取範例 1

在此範例中,如果您執行相同的查詢兩次,則每次都會在記憶體中收到相同對象的參考。

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

物件緩存示例 2

在此範例中,如果您執行從資料庫傳回相同數據列的不同查詢,則每次都會在記憶體中收到相同對象的參考。

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from ord in db.Orders
     where ord.Customer.CustomerID == "BONAP"
     select ord).First().Customer;
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From ord In db.Orders _
     Where ord.Customer.CustomerID = "BONAP" _
     Select ord).First().Customer

另請參閱