Dela via


Objektidentitet

Objekt i körningen har unika identiteter. Två variabler som refererar till samma objekt refererar faktiskt till samma instans av objektet. På grund av detta är ändringar som du gör genom en sökväg genom en variabel omedelbart synliga genom den andra.

Rader i en relationsdatabastabell har inte unika identiteter. Eftersom varje rad har en unik primärnyckel delar inga två rader samma nyckelvärde. Det här faktumet begränsar dock bara innehållet i databastabellen.

I verkligheten hämtas data oftast från databasen och till en annan nivå, där ett program fungerar med den. Det här är den modell som LINQ till SQL stöder. När data hämtas från databasen som rader har du ingen förväntan på att två rader som representerar samma data faktiskt motsvarar samma radinstanser. Om du frågar efter en specifik kund två gånger får du två rader med data. Varje rad innehåller samma information.

Med objekt förväntar du dig något helt annat. Du förväntar dig att om du frågar efter DataContext samma information upprepade gånger kommer det i själva verket att ge dig samma objektinstans. Du förväntar dig det här beteendet eftersom objekt har en särskild betydelse för ditt program och du förväntar dig att de ska bete sig som objekt. Du har utformat dem som hierarkier eller grafer. Du förväntar dig att hämta dem som sådana och inte ta emot många replikerade instanser bara för att du bad om samma sak mer än en gång.

I LINQ till SQL hanterar objektidentiteten DataContext . När du hämtar en ny rad från databasen loggas raden i en identitetstabell av dess primära nyckel och ett nytt objekt skapas. När du hämtar samma rad skickas den ursprungliga objektinstansen tillbaka till programmet. På så sätt DataContext översätter begreppet identitet som ses av databasen (dvs. primära nycklar) till begreppet identitet som ses av språket (dvs. instanser). Programmet ser bara objektet i det tillstånd som det först hämtades. De nya data, om de skiljer sig, ignoreras. Mer information finns i Hämta objekt från identitetscacheminnet.

LINQ till SQL använder den här metoden för att hantera integriteten för lokala objekt för att stödja optimistiska uppdateringar. Eftersom de enda ändringar som sker efter att objektet först har skapats är de som görs av programmet, är avsikten med programmet tydlig. Om ändringar av en extern part har inträffat under tiden identifieras de vid den tidpunkten SubmitChanges() anropas.

Kommentar

Om det objekt som begärs av frågan enkelt kan identifieras som ett som redan har hämtats, körs ingen fråga. Identitetstabellen fungerar som en cache för alla tidigare hämtade objekt.

Exempel

Objekt Cachelagring exempel 1

Om du i det här exemplet kör samma fråga två gånger får du en referens till samma objekt i minnet varje gång.

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()

Objekt Cachelagring exempel 2

Om du i det här exemplet kör olika frågor som returnerar samma rad från databasen får du en referens till samma objekt i minnet varje gång.

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

Se även