如果字段值中没有更改,则实体框架DbContext更新失败

时间:2018-05-15 09:18:06

标签: entity-framework asp.net-web-api

当我们向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 :(得分:1)

这里缺少很多代码。

在您的代码中,您调用SaveChangesAsync(而不是EF SaveChangesAsync)。 可能(但是没有代码可以肯定)你的SaveChangesAsync是一个在有异常时返回false的东西(并且因为你“松散”了异常信息而不是一个好的模式)或者DbSet.SaveChangesAsync返回0。
我认为(但是有很多缺失的代码)这是你的情况。如果您不进行任何更改,SaveChangesAsync将返回0.

修改
System.Exception由您的代码引发(最后一行)。 EF永远不会抛出System.Exception