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

ASP.NET Core MVC编辑功能新增行而非更新现有行问题求助

问题分析与解决办法

这种情况本质是EF Core对实体的状态判断出错,导致执行了INSERT而非UPDATE操作,以下是常见原因和对应解决方案:

1. 主键值未正确传递

你的CustomerEntries实体的主键字段(比如Id)大概率没有在提交的表单中正确传递,导致控制器接收的obj主键为默认值(比如int类型的0)。EF Core会将主键为默认值的实体判定为新实体,执行插入操作。

解决办法:
在Edit视图中添加主键的隐藏输入字段,确保提交时携带现有数据的主键值:

<input type="hidden" asp-for="Id" />

提交后检查控制器中obj.Id的值是否为数据库中现有记录的主键。

2. 直接使用脱离上下文的实体执行Update

从请求绑定得到的obj并未被当前的_db上下文追踪,虽然EF Core的Update方法会尝试根据主键判断状态,但如果主键值存在但上下文未追踪过该实体,可能出现异常判断。更稳妥的方式是先从数据库获取现有实体,再更新属性:

修改控制器代码如下:

[HttpPost]
public IActionResult Edit(CustomerEntries obj)
{
    if (ModelState.IsValid)
    {
        var existingEntry = _db.CustomerEntries.Find(obj.Id);
        if (existingEntry == null)
        {
            return NotFound(); // 处理找不到对应记录的情况
        }

        // 手动映射需要更新的属性(或使用AutoMapper简化操作)
        existingEntry.CustomerName = obj.CustomerName;
        existingEntry.Phone = obj.Phone;
        // 其他需要更新的属性...

        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(obj);
}

这种方式通过上下文追踪现有实体,确保执行的是UPDATE操作。

3. 数据库主键配置异常

检查SQL Server中对应表的主键设置:

  • 确认主键字段是否正确设置(比如是否为表的主键)
  • 如果主键是自增字段,确保编辑时传递的是现有记录的主键值,而非让数据库生成新值

内容的提问来源于stack exchange,提问作者Privesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:17:08