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

ASP.NET Core中调用Update方法更新模型时为什么会产生重复数据?

问题原因

你的更新逻辑生成重复数据的核心原因是提交的Person对象没有携带主键值:
EF Core的Update()方法逻辑是:当传入的实体主键为默认值(比如int类型主键默认值为0、Guid类型主键默认值为空)时,会将该实体判定为全新的待插入数据,执行INSERT操作而非UPDATE操作,自然就会生成重复条目。
而你视图的表单里没有包含Person实体的主键隐藏字段,POST请求提交时自然不会把主键值带到控制器,最终导致EF执行插入逻辑。

解决方案

  1. 最快修复方案:在表单内添加主键隐藏字段
    在你的视图的<form>标签内部添加以下代码(如果你的主键属性名不是Id,替换为对应的字段名即可):
<input type="hidden" asp-for="Id" />

提交时主键会随表单一起传入控制器,EF就能正确识别为已有实体,执行更新操作。

  1. 更安全的优化方案(推荐):不直接使用前端传入的实体执行更新
    直接拿前端传的实体调用Update存在安全风险,恶意用户可以构造请求修改你没有暴露的字段(比如权限、密码相关字段),推荐先从数据库查询出已有实体,再赋值更新字段:
[HttpPost]
public async Task<IActionResult> Edit (Person person)
{
    var existPerson = await db.Persons.FindAsync(person.Id);
    if (existPerson == null)
    {
        return NotFound();
    }
    // 逐一赋值需要更新的字段
    existPerson.Surname = person.Surname;
    existPerson.Name = person.Name;
    existPerson.Email = person.Email;
    
    await db.SaveChangesAsync();           
    return RedirectToAction("Index");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:54:08