EF保存编辑页报错:存储操作影响意外0行问题排查
问题原因
你抛出的"0行受影响"错误由两个核心逻辑错误导致:
- 视图提交的是多条
RESULT类型的记录集合,但Post提交的Edit接口入参定义为单个RESULT对象,模型绑定完全失效。传入的results对象所有属性为类型默认值(ID=0,其余字段为空),EF执行更新时以ID=0为匹配条件,数据库中无对应记录,最终触发报错。 - 现有接口逻辑仅支持单条记录更新,不符合你批量更新多行Result列的业务需求。
修复步骤
1. 重写Post端Edit接口逻辑
将入参改为集合类型,循环处理每条提交数据,仅更新需要修改的RESULT1字段,避免全字段更新带来的数据覆盖、并发校验问题,参考代码:
[HttpPost] public ActionResult Edit(List<RESULT> results) { if (ModelState.IsValid) { foreach (var item in results) { // 按主键查询数据库中存在的对应记录 var existing = _context.RESULT.FirstOrDefault(r => r.ID == item.ID); if (existing != null) { // 仅更新可编辑的RESULT1字段,其余字段保留数据库原值 existing.RESULT1 = item.RESULT1; } } _context.SaveChanges(); return RedirectToAction("Details"); } // 入参为集合类型,返回视图时传入对应集合模型,避免视图渲染报错 return View(results); }
注意:不要直接对未经过数据库查询的实体设置
EntityState.Modified,该操作会标记实体所有字段为待更新状态,若提交数据存在字段缺失,会将数据库中对应字段覆盖为类型默认值,同时提升并发错误触发概率。
2. 调整视图表单字段,保证模型绑定正常
统一表单字段命名前缀和接口入参名一致,不需要更新的字段直接输出静态文本即可,无需渲染为只读输入框(冗余表单字段可能干扰模型绑定),参考代码:
@model List<RESULT> <table class="table"> <tr> <td>@Html.DisplayNameFor(model => model.FirstOrDefault().ID)</td> <td>@Html.DisplayNameFor(model => model.FirstOrDefault().custid)</td> <td>@Html.DisplayNameFor(model => model.FirstOrDefault().TESTID)</td> <td>@Html.DisplayNameFor(model => model.FirstOrDefault().LabTest.TestName)</td> <td>@Html.DisplayNameFor(model => model.FirstOrDefault().RESULT1)</td> </tr> @for (int i = 0; i < Model.Count; i++) { <tr> <td> @* 主键ID必须提交,作为更新匹配依据,设置为只读禁止修改 *@ @Html.TextBox("results[" + i + "].ID", Model[i].ID, new { @readonly = "readonly" }) </td> <td>@Model[i].custid</td> <td>@Model[i].TESTID</td> <td>@Model[i].LabTest.TestName</td> <td> @* 仅渲染可编辑的RESULT1字段为输入框 *@ @Html.TextBox("results[" + i + "].RESULT1", Model[i].RESULT1) </td> </tr> } </table> <div class="form-group"> <div class="col-md-offset-2 col-md-10" style="margin:100px;"> <input type="submit" value="Save" class="btn btn-danger" /> </div> </div>
3. 校验Get端Edit接口
确保渲染Edit视图的Get接口返回的模型类型为List<RESULT>,和视图声明的@model类型、Post接口入参类型保持一致,避免类型不兼容导致的渲染/绑定错误。
补充说明
你之前为数据表添加主键ID列的操作是正确的,EF的更新、删除操作必须依赖主键才能定位记录,该配置没有问题。按以上步骤修正后,即可解决0行受影响的报错,实现批量更新Result列的需求。
内容的提问来源于stack exchange,提问作者MarwanAbu
相关产品推荐
相关产品推荐

