当我们向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
之前检查每条记录是否相等?这似乎没必要。
也许我错过了一些明显的东西。任何建议都非常欢迎。
答案 0 :(得分:1)
这里缺少很多代码。
在您的代码中,您调用SaveChangesAsync
(而不是EF SaveChangesAsync)。
可能(但是没有代码可以肯定)你的SaveChangesAsync是一个在有异常时返回false的东西(并且因为你“松散”了异常信息而不是一个好的模式)或者DbSet.SaveChangesAsync
返回0。
我认为(但是有很多缺失的代码)这是你的情况。如果您不进行任何更改,SaveChangesAsync
将返回0.
修改强>
System.Exception
由您的代码引发(最后一行)。 EF永远不会抛出System.Exception
。