Entity Framework Core генерирует исключение DbUpdateConcurrencyException - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над структурой ядра .net.У меня есть два списка типа класса.Один для обновления, а другой для новой записи, добавление новых записей все работало нормально, но это достигается с помощью контекста. [Модель] .Добавлено, но обновление выполняется с помощью контекста. [Модель]. Обновление сгенерировать исключение выброса Я знаю, что ни одна запись не была обновлена ​​какон работает на локальном компьютере.

$exception  {Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. 

Код

List<AnswerDataModel> surveyResponseListToCreate = new 
List<AnswerDataModel>();

    List<AnswerDataModel> surveyResponseListToUpdate = new 
   List<AnswerDataModel>();

     if (surveyResponseListToUpdate.Count > 0)
            {
                foreach (var answerObject in surveyResponseListToUpdate)
                {
                    Context.Answers.Update(answerObject);

                    if (answerObject.AnswerOptions.Count > 0)
                    {
                        foreach (var optItem in answerObject.AnswerOptions)
                        {
                            AnswerOptionDataModel answOpt = new AnswerOptionDataModel();
                            answOpt = optItem;
                            Context.AnswerOptions.Update(answOpt);
                        }
                    }
                }
            }

        var recordsAffected = Context.SaveChanges();

            if (!UsingExternalTransaction)
            {
                FinalizeTransaction(recordsAffected);
            }

1 Ответ

0 голосов
/ 21 ноября 2018

Я не могу удержаться от цитаты: «Я не думаю, что [ваш код] означает, что вы думаете, что это значит».

Предполагая, что surveyResponseListToUpdate был списком ранее загруженных и измененных сущностей:

if (answerObject.AnswerOptions.Count > 0) // Unnecessary...
{
  foreach (var optItem in answerObject.AnswerOptions)
  {
    AnswerOptionDataModel answOpt = new AnswerOptionDataModel(); // does nothing.
    answOpt = optItem; // references existing answer option..
    Context.AnswerOptions.Update(answOpt);
  }
}

Весь блок сводится к:

  foreach (var optItem in answerObject.AnswerOptions)
    Context.AnswerOptions.Update(optItem);

Ошибка, с которой вы, вероятно, столкнетесь, заключается в том, что Update будет автоматически повторяться через свойства навигации, поэтому, когда родительский элемент (Ответ) обновляется, это AnswerOptions также будет обновлен.Поэтому, когда вы выполняете дополнительные шаги, чтобы попытаться сохранить параметры ответа, они уже были обновлены к моменту сохранения ответа.Если ответ загружен в том же контексте, в котором вы его сохраняете, вы должны быть в открытом виде с:

foreach (var answerObject in surveyResponseListToUpdate)
  Context.Answers.Update(answerObject);

var recordsAffected = Context.SaveChanges();

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

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

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