Megosztás a következőn keresztül:


Objektum identitása

A futtatókörnyezetben lévő objektumok egyedi identitásokkal rendelkeznek. Az ugyanarra az objektumra hivatkozó két változó valójában az objektum ugyanazon példányára hivatkozik. Emiatt az egyik változón keresztüli útvonalon végrehajtott módosítások azonnal láthatók lesznek a másikon keresztül.

A relációs adatbázistáblák sorai nem rendelkeznek egyedi identitásokkal. Mivel minden sor egyedi elsődleges kulccsal rendelkezik, nincs két sor ugyanazzal a kulcsértékel. Ez a tény azonban csak az adatbázistábla tartalmát korlátozza.

A valóságban az adatok leggyakrabban az adatbázisból és egy másik szintre kerülnek, ahol egy alkalmazás együttműködik vele. Ezt a modellt támogatja a LINQ az SQL-hez. Ha az adatok sorként kerülnek ki az adatbázisból, nem kell elvárnia, hogy az azonos adatokat képviselő két sor ténylegesen ugyanazoknak a sorpéldányoknak feleljen meg. Ha két alkalommal kérdez le egy adott ügyfelet, két adatsort kap. Minden sor ugyanazokat az információkat tartalmazza.

Az objektumokkal valami nagyon másra számíthat. Arra számít, hogy ha ismételten ugyanazokat az DataContext információkat kéri, az ugyanazt az objektumpéldányt fogja megadni. Ezt a viselkedést azért várhatja el, mert az objektumok különleges jelentéssel rendelkeznek az alkalmazás számára, és elvárja, hogy objektumként viselkedjenek. Hierarchiákként vagy grafikonokként tervezte őket. Elvárja, hogy lekérje őket, és ne fogadjon replikált példányokat csak azért, mert több alkalommal is ugyanazt kérte.

A LINQ-ban az SQL az DataContext objektumdentitást kezeli. Amikor új sort kér le az adatbázisból, a sor egy identitástáblában lesz naplózva az elsődleges kulccsal, és létrejön egy új objektum. Amikor ugyanazt a sort kéri le, az eredeti objektumpéldányt a rendszer visszaküldi az alkalmazásnak. Ily módon az DataContext adatbázis által látott identitás fogalmát (vagyis az elsődleges kulcsokat) lefordítja a nyelv által látott identitás fogalmára (azaz példányokra). Az alkalmazás csak abban az állapotban látja az objektumot, amelyben az első lekérés történt. A rendszer elveti az új adatokat, ha eltérnek. További információ: Objektumok lekérése az Identitásgyorsítótárból.

A LINQ–SQL ezzel a módszerrel kezeli a helyi objektumok integritását az optimista frissítések támogatása érdekében. Mivel az objektum első létrehozása után csak az alkalmazás által végrehajtott módosítások következnek be, az alkalmazás szándéka egyértelmű. Ha egy külső fél időközben változtatásokat végzett, a rendszer a meghíváskor SubmitChanges() azonosítja őket.

Feljegyzés

Ha a lekérdezés által kért objektum könnyen azonosítható, mint egy már lekért objektum, a rendszer nem hajt végre lekérdezést. Az identitástábla az összes korábban lekért objektum gyorsítótáraként működik.

Példák

1. példa objektum gyorsítótárazására

Ebben a példában, ha ugyanazt a lekérdezést kétszer hajtja végre, minden alkalommal ugyanarra az objektumra fog hivatkozni a memóriában.

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. példa objektum gyorsítótárazására

Ebben a példában, ha különböző lekérdezéseket hajt végre, amelyek ugyanazt a sort adják vissza az adatbázisból, minden alkalommal ugyanarra az objektumra fog hivatkozni a memóriában.

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

Lásd még