LINQ старые данные возвращаются - PullRequest
0 голосов
/ 07 июня 2011

Я не получил нигде на форуме Microsoft. То, что сработало для одного пользователя, не сработало для меня, поэтому я, должно быть, делаю что-то не так.

Мне нужно, чтобы возвращаемые данные соответствовали тому, что находится в базе данных, но через 6 секунд они возвращаются как предыдущие данные, которые были только что обновлены. Я создаю контекст внутри метода и использую StoreWins, но, возможно, я использую его неправильно.

Вот пример метода.

    public bool MyExampleMethod(long id, long newId, long oldId)
    {
        using (var context = new myEntity())
        {
            my_table data = (from d in context.my_table
                             where d.id == id
                             select d).FirstOrDefault();


            context.Refresh(System.Data.Objects.RefreshMode.StoreWins, data);

            if (data.dataId != oldId) { return false; }

            data.dataId = newId;
            context.SaveChanges();
            return true;
        }
    }

У меня также есть вход в систему с временными метками, потому что я отслеживаю oldId. Я видел (более одного раза) 6 секунд спустя, что метод вызывается снова с использованием неправильного (old oldId), и строка возвращается со старым oldId вместо ранее установленного newId. Это невозможно, потому что dataId был изменен на newId и сохранен. NewId никогда не совпадает со oldId, и я убедился, что этого не происходит. Проблема происходит случайно. В 99% случаев это нормально, но когда он возвращает старые данные, он создает много неверных данных, которые я должен исправить вручную.

Должен ли я что-то делать после context.SaveChanges ()? или я неправильно использую StoreWins?

Дополнительная информация:

ID: Первичный ключ / идентификационный столбец.

NewID: Это идентификатор пользователя, который обновляет строку

oldId: Это идентификатор пользователя, который последний раз обновлял строку

Мне нужно убедиться, что строка не была изменена кем-то еще, прежде чем обновлять ее. Первоначально я имел oldId в коде LINQ, но изменил его, пытаясь выяснить, почему возвращаются старые данные.

Дело в том, что если кто-то еще меняет строку, и она уже была кем-то изменена, мне нужно уведомить пользователя.

Сегодня я увидел, что 16 секунд спустя старые данные были возвращены кодом LINQ (у меня есть временные метки). Я начинаю думать, что проблема в том, что изменения иногда не сохраняются или это какая-то проблема с кэшированием.

Обновление: Я думаю, я мог бы знать, почему .. запускать некоторые тесты.

Ответы [ 2 ]

0 голосов
/ 11 июня 2011

Эта строка смущает меня:

where d.id == id

Если это будет

 where d.dataId == id

Если нет, объясните, пожалуйста, в чем разница между

id, newId, oldId, data.id и data.dataId

0 голосов
/ 10 июня 2011

Я никогда не видел, чтобы это было сделано так, как вы это делаете.Обычно вы пытаетесь сохранить в блоке try.если происходит сбой из-за исключения параллелизма, тогда вы делаете context.refresh в вашем блоке catch;

    try
    {
        int num = context.SaveChanges();
    }
    catch (OptimisticConcurrencyException)
    {
        context.Refresh(RefreshMode.ClientWins, data);
        context.SaveChanges();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...