Linq to SQL Странное кеширование? - PullRequest
2 голосов
/ 31 мая 2009

У меня странная (поправьте меня, если я ошибаюсь) ошибка / функция с Linq to SQL, которая озадачивает меня и пытается понять, что происходит.

Итак, я взял весь процесс процедурно в надежде найти решение и пока не могу исправить.

Вот репродукция происходящего:

  1. Запись об изменении внесена в таблицу базы данных "ETickets". Изменен столбец «доступность» с 9 до 8 (см. ниже) Изменение внесено в базу данных http://www.composeandshoot.com/soverflow/changemadetodb.jpg

  2. Обновить страницу с ретранслятором ASP, привязанную к таблице ETickets. Это по-прежнему отображается «9».

  3. Посмотрел quickwatch на привязке данных, чтобы увидеть, какое значение возвращалось из базы данных (см. Ниже): Быстрый просмотр http://www.composeandshoot.com/soverflow/linqtosqlquickwatch.jpg

  4. Итак, я взглянул на запрос, запущенный на сервере SQL. Запустил SQL Server Profiler и получил следующее (см. Ниже): SQL profiler http://www.composeandshoot.com/soverflow/linqquery.jpg

  5. Выполнен запрос

    exec sp_executesql N'SELECT [t0]. [Id], [t0]. [Eventid], [t0]. [Доступность], [t0]. [Стоимость] ОТ [dbo]. [ETickets] AS [t0] ГДЕ [t0]. [Id] = @ p0 ', N' @ p0 uniqueidentifier ', @ p0 =' 2642C0EF-C0C5-4881-9AC8-53C023B444D2 '

  6. SQL Server возвращает «8» в качестве доступности! Тем не менее привязка данных по-прежнему показывает «9». Я не включил никакой зависимости кеша SQL.

Пожалуйста, кто-нибудь может указать мне правильное направление здесь? Спасибо.

Ответы [ 2 ]

2 голосов
/ 31 мая 2009

Каков жизненный цикл контекста данных? Это тот же контекст данных или каждый раз новый? (вероятно, должно быть последнее).

Если вы повторно используете контекст данных, он обязан всегда возвращать вам один и тот же объект , когда кажется, что он идентичен. Так что, если он ранее дал вам версию с 9, он будет продолжать возвращать вам эту ссылку, даже если базовые данные изменятся.

На данный момент это все еще происходит в оба конца; Чтобы избежать поездки туда и обратно, нужно использовать:

var obj = ctx.SomeTable.Single(x=>x.Id == id);

т.е. если у него уже есть объект с Id == id в локальном кэше идентификаторов, он вообще не будет выполнять запрос к данным.

любая другая конструкция будет совершать туда и обратно. В 4.0 есть исправление , так что .Where(x=>x.Id == id).Single() позволит избежать обхода, который должен иметь синтаксис запроса, т.е.

var obj = (from x in ctx.SomeTable
           where x.Id == id
           select x).Single();
1 голос
/ 31 мая 2009

Вы обновляете, используя один DataContenxt, пока тот, к которому вы запросите позже, еще жив?

Если да, то это ответы, которые вы должны ожидать.

Если вы создали новый DataContenxt после обновления или обновления, и чтение выполняется для того же DataContext, вы должны получить правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...