ASP.NET Core中调用Update方法更新模型时为什么会产生重复数据?
问题原因
你的更新逻辑生成重复数据的核心原因是提交的Person对象没有携带主键值:
EF Core的Update()方法逻辑是:当传入的实体主键为默认值(比如int类型主键默认值为0、Guid类型主键默认值为空)时,会将该实体判定为全新的待插入数据,执行INSERT操作而非UPDATE操作,自然就会生成重复条目。
而你视图的表单里没有包含Person实体的主键隐藏字段,POST请求提交时自然不会把主键值带到控制器,最终导致EF执行插入逻辑。
解决方案
- 最快修复方案:在表单内添加主键隐藏字段
在你的视图的<form>标签内部添加以下代码(如果你的主键属性名不是Id,替换为对应的字段名即可):
<input type="hidden" asp-for="Id" />
提交时主键会随表单一起传入控制器,EF就能正确识别为已有实体,执行更新操作。
- 更安全的优化方案(推荐):不直接使用前端传入的实体执行更新
直接拿前端传的实体调用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
相关产品推荐
相关产品推荐

