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
相关产品推荐
相关产品推荐

