entity-framework - 如果字段值没有变化,实体框架 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
吗?似乎没有必要。
也许我错过了一些明显的东西。非常欢迎任何建议。
解决方案
这里缺少很多代码。
在您的代码中,您调用您的SaveChangesAsync
(而不是 EF SaveChangesAsync)。可能(但没有确定的代码)你的 SaveChangesAsync 是返回 false 如果有异常(并且不是一个好的模式,因为你“松散”异常信息)或者如果DbSet.SaveChangesAsync
返回 0。
我认为(但有是很多缺失的代码)这是你的情况。如果您不进行任何更改,则SaveChangesAsync
返回 0。
编辑由您的代码引发(最后一行)
。System.Exception
EF 从不抛出System.Exception
.
推荐阅读
- pandas - pandas - 根据不是特定的索引整数和列值设置值
- mysql - 即使在 mysql_native_password 之后,Node 和 Adonis 的 MySQL 身份验证错误
- c++ - 通过 Visual Studio 构建/运行 qBittorrent?
- excel - 如何通过openpyxl清除整个工作簿的条件格式
- python - 比较列表中的列表并计算出现次数
- html - 如何将鼠标悬停在使用渐变的图像上
- ipc - 通过 IPC 连接调度任务无法正确运行
- react-native - 当我在 React-native 或 Expo 弹出中移动屏幕时,如何删除启动画面?
- crm - 我正在尝试更改 SSRS fetchdatasource 使用的沙盒主机
- javascript - 如何在 JS 中格式化对象数组