ASP.NET Core中Edit更新函数异常:持续创建新数据而非更新
ASP.NET Core Edit功能故障排查与修复建议
问题代码
public IActionResult Edit(int? id) { if (id == null || id == 0) { return NotFound(); } var categoryFromDb = _db.Festivals.Find(id); if (categoryFromDb == null) { return NotFound(); } return View(categoryFromDb); } // POST [HttpPost] [ValidateAntiForgeryToken] public IActionResult Edit(Festival obj) { if (obj.Naam == obj.Plaats) { ModelState.AddModelError("CustomError", "The DisplayOrder cannot exactly match the Name."); } if (ModelState.IsValid) { _db.Festivals.Update(obj); _db.SaveChanges(); return RedirectToAction("Index"); } return View(obj); }
排查与修复步骤
1. 先排查数据库迁移问题
- 打开第二次迁移的代码文件,核对是否修改了
Festival实体的字段规则(比如新增必填项、修改字段类型、添加唯一约束等),如果迁移后数据库结构和实体类不匹配,会直接导致编辑失败。 - 回滚第二次迁移测试:在Package Manager Console执行
Update-Database [第一次迁移的名称],验证Edit功能是否恢复,以此确认是不是迁移导致的问题。 - 检查
Festivals表的实际数据,查看待编辑的记录有没有不符合新约束的字段值。
2. 修复代码逻辑的潜在问题
- 替换直接Update的写法:直接用
_db.Festivals.Update(obj)风险很高,如果前端表单没提交所有字段,未提交的字段会被设为默认值(比如null)。改成先从数据库取实体,再更新指定字段:
[HttpPost] [ValidateAntiForgeryToken] public IActionResult Edit(Festival obj) { if (obj.Naam == obj.Plaats) { ModelState.AddModelError("CustomError", "The DisplayOrder cannot exactly match the Name."); } if (ModelState.IsValid) { var festivalFromDb = _db.Festivals.Find(obj.Id); if(festivalFromDb == null) return NotFound(); // 只更新需要修改的字段 festivalFromDb.Naam = obj.Naam; festivalFromDb.Plaats = obj.Plaats; // 其他需要更新的字段按需添加 _db.SaveChanges(); return RedirectToAction("Index"); } return View(obj); }
- 排查Model验证失败原因:在POST方法开头加一行调试代码
var errors = ModelState.Values.SelectMany(v => v.Errors);,运行时查看所有验证错误,确认是不是有新增的必填字段没在表单里提交。 - 确保自定义错误能显示:检查视图里有没有添加自定义错误的显示代码,比如:
<div asp-validation-summary="All" class="text-danger"></div> <!-- 或者单独显示自定义错误 --> <span asp-validation-for="CustomError" class="text-danger"></span>
3. 其他细节检查
- 确认视图表单里有没有隐藏的Id字段:
<input type="hidden" asp-for="Id" />,如果Id没提交,Update操作找不到要修改的记录。 - 检查DbContext的配置,看看有没有新增全局过滤、实体配置变更,导致查询或更新行为异常。
内容的提问来源于stack exchange,提问作者Bolts
相关产品推荐
相关产品推荐

