Sdílet prostřednictvím


Identita objektu

Objekty v modulu runtime mají jedinečné identity. Dvě proměnné, které odkazují na stejný objekt, ve skutečnosti odkazují na stejnou instanci objektu. Z tohoto důvodu jsou změny, které provedete cestou přes jednu proměnnou, okamžitě viditelné prostřednictvím druhé.

Řádky v tabulce relační databáze nemají jedinečné identity. Vzhledem k tomu, že každý řádek má jedinečný primární klíč, žádné dva řádky nesdílejí stejnou hodnotu klíče. Tento fakt ale omezuje pouze obsah tabulky databáze.

Ve skutečnosti se data nejčastěji vynesou z databáze a do jiné vrstvy, kde s ní aplikace pracuje. Jedná se o model, který LINQ to SQL podporuje. Při přenesení dat z databáze jako řádků nemáte žádné očekávání, že dva řádky, které představují stejná data, ve skutečnosti odpovídají stejným instancím řádků. Pokud dotazujete konkrétního zákazníka dvakrát, získáte dva řádky dat. Každý řádek obsahuje stejné informace.

U objektů očekáváte něco velmi odlišného. Očekáváte, že pokud požádáte DataContext o stejné informace opakovaně, ve skutečnosti vám poskytne stejnou instanci objektu. Toto chování očekáváte, protože objekty mají pro vaši aplikaci zvláštní význam a očekáváte, že se budou chovat jako objekty. Navrhli jste je jako hierarchie nebo grafy. Očekáváte, že je načtete jako takové a nebudete dostávat velké množství replikovaných instancí jen proto, že jste požádali o stejnou věc více než jednou.

V LINQ to SQL spravuje identitu objektu DataContext . Pokaždé, když z databáze načtete nový řádek, zaprotokoluje se v tabulce identit podle primárního klíče a vytvoří se nový objekt. Při každém načtení stejného řádku se původní instance objektu vrátí do aplikace. Tímto způsobem DataContext přeloží koncept identity, jak je vidět v databázi (to znamená primární klíče) do konceptu identity, kterou vidí jazyk (to znamená instance). Aplikace vidí pouze objekt ve stavu, že byl poprvé načten. Nová data, pokud se liší, se zahodí. Další informace naleznete v tématu Načítání objektů z mezipaměti identit.

LINQ to SQL používá tento přístup ke správě integrity místních objektů za účelem podpory optimistických aktualizací. Vzhledem k tomu, že jediné změny, ke kterým dojde po vytvoření objektu, jsou ty, které aplikace provede, je záměr aplikace jasný. Pokud došlo k změnám vnější strany v přechodné fázi, jsou identifikovány v okamžiku SubmitChanges() , kdy je volána.

Poznámka:

Pokud je objekt požadovaný dotazem snadno identifikovatelný jako již načtený, nebude proveden žádný dotaz. Tabulka identit funguje jako mezipaměť všech dříve načtených objektů.

Příklady

Objekt Ukládání do mezipaměti Příklad 1

Pokud v tomto příkladu dvakrát spustíte stejný dotaz, obdržíte pokaždé odkaz na stejný objekt v paměti.

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 Ukládání do mezipaměti příklad 2

Pokud v tomto příkladu spustíte různé dotazy, které vrátí stejný řádek z databáze, obdržíte pokaždé odkaz na stejný objekt v paměti.

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

Viz také