Каждый раз, когда я вижу эту ошибку, это означает, что что-то изменилось в базе данных между моментом, когда я загружал запись / объект / что угодно, и когда я пытался сохранить ее.Безусловно, это было потому, что моя единица работы была слишком большой.
Я не знаю точную природу вашего приложения, но я предполагаю, что вы создаете контекст данных, загружаете запись или списокзаписи, выполняя некоторые операции над ним, затрачивая время и процессорные циклы, а затем в конце пытаясь сохранить измененные данные обратно в базу данных.Может быть, даже загружать экземпляр записи / объекта и сохранять его некоторое время в переменной класса, а затем в конце загрузки страницы или потока или чего-либо другого, пытаясь сохранить обратно все, что изменилось.Проблема в том, что, поскольку LINQ хранит копию этой копии, она должна быть обновлена.Если базовые данные тем временем изменяются, они злятся.
Задайте себе вопрос: что, если вы поместите блокирующую транзакцию в свои данные на все время жизни ваших объектов.Скажите, что все, что вы загрузили, может измениться, никто больше не сможет прикоснуться к нему в течение этого времени.В основном это предположение здесь.Конечно, LINQ немного более оптимистичен в этом отношении, нет смысла блокировать строку или таблицу, если вы никогда не обновляете данные, но вы думаете об этих проблемах.Спросите себя, что могло бы существенно сломаться или замедлиться, если бы вы наложили строгие транзакционные блокировки на ваши объекты, и это, вероятно, укажет вам на код, вызывающий сбой.
Мое решение - сохранить мою единицу работы каккак можно меньше.Не загружайте объект и не используйте его в качестве рабочей копии, а сохраняйте обратно в базу данных, все в одном контексте.Вместо этого загрузите объект и извлеките необходимую информацию за один шаг, затем выясните, какие изменения необходимо применить, а затем загрузите / обновите / сохраните объект.Конечно, это вызывает больше обращений к базе данных, но дает вам лучшую уверенность в том, что вы работаете с последней копией данных.Это по-прежнему будет «последним, побеждает», что означает, что если кто-то сделал обновление, когда вы работали с данными, оно может быть потеряно, но это всегда риск, если вы не заблокируете запись с помощью транзакции.Однако это дает вам гибкость: если кто-то еще изменяет несвязанные поля в одной строке, вы оба можете работать с этими данными вместе.