首页 > 解决方案 > 如果字段值没有变化,实体框架 DbContext 更新将失败

问题描述

当我们向 DbContext 传递一个值没有改变的对象,并尝试执行时,Update我们得到一个500 internal server error.

用户可以打开一个对话框来编辑一条记录、更改一个值、将其更改回来,然后将记录发送到数据库。此外,我们还提供备份和恢复功能,当恢复记录时,其中一些记录在执行备份后不会更改。

我的印象是 aPUT会删除并重新创建记录,所以我觉得不会有问题。

例如,检查Activity存在 myActivityController如下:

                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吗?似乎没有必要。

也许我错过了一些明显的东西。非常欢迎任何建议。

标签: entity-frameworkasp.net-web-api

解决方案


这里缺少很多代码。

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

编辑由您的代码引发(最后一行)
System.ExceptionEF 从不抛出System.Exception.


推荐阅读