Обновление Entity Framework DbContext завершается ошибкой, если значения полей не меняются - PullRequest
0 голосов
/ 15 мая 2018

Когда мы передаем нашему DbContext объект, значения которого не изменились, и пытаемся выполнить Update, мы получаем 500 internal server error.

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

У меня сложилось впечатление, что PUT удалит и заново создаст запись, поэтому я не чувствовал, что возникнет проблема.

Например, проверив, существует ли Activity, мой ActivityController выглядит следующим образом:

                var activityEntityFromRepo = _activityRepository.GetActivity(id);

            // Map(source object (Dto), destination object (Entity))
            _mapper.Map(activityForUpdateDto, activityEntityFromRepo);

            _activityRepository.UpdateActivity(activityEntityFromRepo);

            // Save the updated Activity entity, added to the DbContext, to the SQL database.
            if (await _activityRepository.SaveChangesAsync())
            {
                var activityFromRepo = _activityRepository.GetActivity(id);
                if (activityFromRepo == null)
                {
                    return NotFound("Updated Activity could not be found");
                }

                var activity = _mapper.Map<ActivityDto>(activityFromRepo);
                return Ok(activity);
            }
            else
            {
                // The save failed.
                var message = $"Could not update Activity {id} in the database.";
                _logger.LogWarning(message);
                throw new Exception(message);
            };

Мой ActivityRepository выглядит следующим образом:

        public void UpdateActivity(Activity activity)
    {
        _context.Activities.Update(activity);
    }

Если какое-либо из полей изменилось, мы не получим ошибку. Нужно ли проверять каждую запись на равенство перед PUT? Кажется ненужным.

Возможно, я упустил что-то очевидное. Любые предложения очень приветствуются.

1 Ответ

0 голосов
/ 15 мая 2018

Здесь много кода отсутствует.

В своем коде вы называете SaveChangesAsync (не EF SaveChangesAsync). Вероятно (но не код, чтобы быть уверенным), ваш SaveChangesAsync является чем-то, что возвращает false, если есть исключение (и не является хорошим шаблоном, потому что вы «теряете» информацию об исключении) или если DbSet.SaveChangesAsync возвращает 0.
Я думаю (но есть много пропущенного кода), что это ваш случай. Если вы не вносите никаких изменений, SaveChangesAsync возвращает 0.

EDIT
System.Exception поднимается вашим кодом (последняя строка). EF никогда не бросает System.Exception.

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