Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Объекты в среде выполнения имеют уникальные идентификаторы. Две переменные, ссылающиеся на один и тот же объект, фактически ссылаются на один и тот же экземпляр объекта. Из-за этого изменения, внесенные путем пути через одну переменную, немедленно видны через другую.
Строки в таблице реляционной базы данных не имеют уникальных идентификаторов. Так как каждая строка имеет уникальный первичный ключ, две строки не используют одно и то же значение ключа. Однако этот факт ограничивает только содержимое таблицы базы данных.
В действительности данные чаще всего извлекаются из базы данных и переносятся на другой уровень, где приложение работает с ними. Это модель, которую поддерживает 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