You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:50:44