Udostępnij za pośrednictwem


Tożsamość obiektu

Obiekty w środowisku uruchomieniowym mają unikatowe tożsamości. Dwie zmienne odwołujące się do tego samego obiektu odnoszą się do tego samego wystąpienia obiektu. Z tego powodu zmiany wprowadzane przez ścieżkę przez jedną zmienną są natychmiast widoczne przez drugą.

Wiersze w tabeli relacyjnej bazy danych nie mają unikatowych tożsamości. Ponieważ każdy wiersz ma unikatowy klucz podstawowy, żadne dwa wiersze nie mają tej samej wartości klucza. Jednak ten fakt ogranicza tylko zawartość tabeli bazy danych.

W rzeczywistości dane są najczęściej wyprowadzane z bazy danych i do innej warstwy, w której aplikacja współpracuje z nią. Jest to model, który obsługuje LINQ to SQL. Gdy dane są wynosowane z bazy danych jako wierszy, nie masz oczekiwań, że dwa wiersze reprezentujące te same dane rzeczywiście odpowiadają tym samym wystąpieniom wierszy. Jeśli wykonasz zapytanie o określonego klienta dwa razy, otrzymasz dwa wiersze danych. Każdy wiersz zawiera te same informacje.

W przypadku obiektów oczekujesz czegoś zupełnie innego. Oczekujesz, że jeśli wielokrotnie pytasz DataContext o te same informacje, w rzeczywistości da to to samo wystąpienie obiektu. Oczekujesz tego zachowania, ponieważ obiekty mają specjalne znaczenie dla aplikacji i oczekujesz, że będą zachowywać się jak obiekty. Zostały one zaprojektowane jako hierarchie lub grafy. Oczekujesz, że pobierzesz je jako takie i nie otrzymasz wielu replikowanych wystąpień tylko dlatego, że poproszono o to samo więcej niż jeden raz.

W linQ to SQL DataContext zarządza tożsamością obiektu. Za każdym razem, gdy pobierasz nowy wiersz z bazy danych, wiersz jest rejestrowany w tabeli tożsamości przy użyciu klucza podstawowego i tworzony jest nowy obiekt. Za każdym razem, gdy pobierasz ten sam wiersz, oryginalne wystąpienie obiektu jest przekazywane do aplikacji. W ten sposób DataContext tłumaczy koncepcję tożsamości, która jest postrzegana przez bazę danych (czyli klucze podstawowe) na koncepcję tożsamości postrzeganej przez język (czyli wystąpienia). Aplikacja widzi tylko obiekt w stanie, w jaki został on po raz pierwszy pobrany. Nowe dane, jeśli są inne, zostaną odrzucone. Aby uzyskać więcej informacji, zobacz Pobieranie obiektów z pamięci podręcznej tożsamości.

LinQ to SQL używa tego podejścia do zarządzania integralnością obiektów lokalnych w celu obsługi optymistycznych aktualizacji. Ponieważ jedyne zmiany, które występują po pierwszym utworzeniu obiektu, są wprowadzane przez aplikację, intencja aplikacji jest jasna. Jeśli zmiany ze strony zewnętrznej wystąpiły w międzyczasie, są one identyfikowane w czasie SubmitChanges() jest wywoływany.

Uwaga

Jeśli obiekt żądany przez zapytanie jest łatwo rozpoznawalny jako obiekt już pobrany, żadne zapytanie nie jest wykonywane. Tabela tożsamości działa jako pamięć podręczna wszystkich wcześniej pobranych obiektów.

Przykłady

Obiekt Buforowanie przykład 1

W tym przykładzie, jeśli wykonasz to samo zapytanie dwa razy, za każdym razem otrzymasz odwołanie do tego samego obiektu w pamięci.

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

Obiekt Buforowanie przykład 2

W tym przykładzie w przypadku wykonywania różnych zapytań, które zwracają ten sam wiersz z bazy danych, za każdym razem otrzymasz odwołanie do tego samego obiektu w pamięci.

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

Zobacz też