Строка Linq не найдена или изменена - программирование
Подтвердить что ты не робот

Строка Linq не найдена или изменена

Error Message: Row not found or changed.
Stack Trace:
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 

Это происходит, по-видимому, случайным образом. Я получаю по электронной почте эти ошибки, и URL-адрес, который, как всегда, работает для меня и должен работать и для всех остальных.

Я могу исправить эту ошибку:

  • Переход к макету dbml
  • Выбор каждого поля в таблице, вызывающей конфликты
  • Щелкните правой кнопкой мыши и установите для свойства Update Check значение Never

Это, по-видимому, предотвращает выброс этих типов ошибок.

Однако, это сложно делать, когда я делаю шанс на dmbl, добавлять новые таблицы и т.д. Есть ли лучший способ решить эту проблему? Я получаю, возможно, 50-100 из них в день, что плохо для моих посетителей.

4b9b3361

Ответ 1

Каждый раз, когда я видел эту ошибку, это означает, что что-то изменилось в базе данных между тем временем, когда я загрузил запись/объект/все, и когда я пытался его сохранить. В обязательном порядке, это было потому, что моя единица работы была слишком большой.

Я не знаю точной природы вашего приложения, но я предполагаю, что вы создаете контекст данных, загружаете запись или список записей, выполняете некоторые операции над ним, повторяете время и процессорные циклы и затем в конце пытается сохранить измененные данные обратно в базу данных. Возможно, даже загрузите экземпляр записи/объекта и сохраните его в переменной класса некоторое время, а затем в конце загрузки страницы или потока или любого другого, кто пытается сохранить все, что изменилось. Проблема в том, что поскольку LINQ хранит копию этого, то есть копию, которую он хочет обновить. Если базовые данные меняются тем временем, это становится безумным.

Спросите себя, что, если вы поместите транзакцию блокировки на свои данные на протяжении всего срока службы ваших объектов. Скажите, что все, что вы загрузили, может измениться, никто еще не сможет коснуться его в течение этого времени. В принципе, это предположение здесь. Конечно, LINQ немного оптимистичнее, не имеет смысла блокировать строку или таблицу, если вы, возможно, никогда не будете обновлять данные, но вы думаете об этих проблемах. Спросите себя, что может сильно сломаться или замедлить, если вы должны установить строгие транзакционные блокировки на своих объектах, и это, вероятно, укажет вам на нарушающий код.

Мое решение заключается в том, чтобы моя единица работы была как можно меньше. Не загружайте объект и не используйте его в качестве рабочей копии и сохраните его обратно в базу данных, все в одном контексте. Вместо этого загрузите объект и вытащите необходимую информацию за один шаг, затем определите изменения, которые необходимо применить, а затем загрузите/обновите/сохраните объект. Уверен, что он вызывает больше круглых поездок в базу данных, но дает вам больше уверенности в том, что вы работаете с последней копией данных. Он по-прежнему будет "последним, выигрывает", а это означает, что если кто-то сделал обновление во время работы с данными, он может быть потерян, но это всегда является риском, если вы не заблокируете запись транзакцией. Тем не менее, он покупает вам гибкость, что если кто-то другой изменяет не связанные поля в одной строке, вы оба можете работать с этими данными вместе.

Ответ 2

У меня была такая же проблема, и она была решена путем сравнения структуры dbml с db. Одно свойство не было установлено как nullable, и это вызывало проблему.

Итак, проверьте свои свойства dbml и nullable.

Ответ 3

GetTable(). Прикрепить (newEntity, originalEntity);

Если вы не используете обновляемое поле для обновления, описанный выше метод параметризует новые детали и старые детали данных, если исходный объект был изменен в этот момент, вы все равно получите ту же ошибку, это зависит от вас обеспечить. Это работает как шарм, я пробовал.

Ответ 4

Это также может произойти, если триггер базы данных изменяет любой столбец в строке, которую вы обновляете, даже если вы не обновляете этот конкретный столбец.

Вам придется дважды проверить, что на какой-либо из таблиц, затронутых на вашем рабочем месте, нет триггеров. Если вы используете триггеры обновлений, вы, вероятно, захотите убедиться, что обновленные столбцы NeverCheck.

Ответ 5

Иногда это очень просто... Убедитесь, что на столе нет замков. В моем случае в пользовательском интерфейсе SQL Server Management Studio были заблокированы блокировки, о которых я не знал (не помню) во время отладки. Разгрузка его очистила эти блокировки, и все снова начало работать.

Ответ 6

Использование SQL Profiler Я отслеживал транзакции SQL по отношению к моему серверу и понял, что в SubmitChanges() переданный оператор UPDATE содержит неправильное значение в предложении WHERE. Это потому, что у меня есть свойство, которое выглядит так:

class Position{
...
    [Column]
    public int Pieces{
        get{
            this.pieces = this.Transformers.Count;

            return this.pieces;
        }
        set{ this.pieces = value; }
    }
...
}

Так как Transformers является элементом List<Transformers>, который представляет список отношений "один-ко-многим" с другой таблицей Transformers, я вручную должен заполнить список с каждым Transformer, который содержит внешний ключ для моего Position объект. Если по какой-то причине я этого не делаю, тогда я получу упоминаемую ошибку, потому что свойство Pieces смещено от исходного значения.

Таким образом, оператор SQL на SubmitChanges() будет искать запись WHERE Pieces = somevalue, но фактическое значение Pieces в записи anothervalue. Поэтому LINQ будет думать, что вы кое-что изменили в db, потому что db не вернет этому запросу значение.

Как указано, одно из решений:

    [Column(UpdateCheck=UpdateCheck.Never)]
    public int Pieces
    {
        get {
            this.pieces= this.Transformers.Count;

            return this.pieces; 
        }
        set { this.pieces= value; }
    }

Конечно, это также можно легко решить, установив простую функцию getter, например

getPieces(){
    return this.Transformers.Count();
}

и "несмещенное" свойство

class Position{
...
    [Column]
    public int Pieces{
        get{ return this.pieces; }
        set{ this.pieces = value; }
    }
...
}

Надеюсь, это может помочь кому-то. Я публикую это также потому, что, если бы кто-то еще раньше, он бы спас мне часы моей жизни.

Ответ 7

Я получал эту ошибку на Windows Phone 8. И мне потребовалось некоторое время, чтобы понять, в чем проблема. В основном это было:

У меня был класс под названием TrackingInformation. 1. С сервера я получил обновленную версию. 2. Мой TileService обновил вторичную плитку с информацией и (!!) обновил 1 свойство и сохранил его в локальной базе данных на телефоне. 3. Я попытался снова сохранить первый экземпляр объекта, и здесь я получил ошибку "строка не найдена или изменена".

Для меня мне просто пришлось удалить третью часть, и она отлично работала (я уже был сохранен с обновленной версией). Но поскольку одно свойство изменилось, оно исключило...

Я не могу дождаться появления EF7 на Windows Phone, так много головной боли с текущим EF на WP8.

Ответ 8

обновление linq до sql-схемы в решении проблемы с дизайном в моем случае

Ответ 9

Я столкнулся с той же проблемой. Проблема возникает, когда вы обновляете строку.

Например, у меня есть таблица со столбцами:

id,firstname,lastname,age

и я хочу, чтобы обновить возраст, используя dbml. В профиле я вижу обновите [email protected], где [email protected] и [email protected] и [email protected].

Но между чтением строки и обновлением какой-то другой процесс изменил имя или фамилию. UPDATE завершается ошибкой, потому что предложение WHERE имеет другое значение для одного из столбцов, а обновление возвращает @@rowcount==0 в dbml, что приводит к полученной вами ошибке.