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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:36:16