ASP.NET MVC删除记录报错:影响行数异常问题求助
解决ASP.NET MVC中EF删除操作的"影响行数为0"错误
错误原因
这个报错是Entity Framework执行删除时找不到对应主键的数据库记录,常见原因包括:
- 前端传递的实体主键值不正确或缺失
- 目标记录已被其他操作删除
- 直接使用未被上下文跟踪的实体执行删除操作
解决方案
方案1:先查询实体再删除(最可靠)
先通过主键从数据库获取实体,确认存在后再执行删除,避免操作不存在的记录:
[HttpPost] public ActionResult Delete(int id) // 直接接收主键ID,而非完整实体 { var memberToDelete = _memberContext.tblMember.Find(id); if (memberToDelete != null) { _memberContext.tblMember.Remove(memberToDelete); _memberContext.SaveChanges(); TempData["DeleteMessage"] = "<script>alert('Data Deleted')</script>"; } else { TempData["DeleteMessage"] = "<script>alert('Record does not exist')</script>"; } return RedirectToAction("MemberList"); }
注意:前端表单需传递主键id,比如用@Html.HiddenFor(m => m.Id)或路由参数传递。
方案2:使用仅含主键的无跟踪实体删除
如果不想查询数据库,可创建仅包含主键的实体,附加到上下文后标记删除:
[HttpPost] public ActionResult Delete(tblMember objMember) { if (objMember.Id <= 0) // 先校验主键有效性 { TempData["DeleteMessage"] = "<script>alert('Invalid record ID')</script>"; return RedirectToAction("MemberList"); } var member = new tblMember { Id = objMember.Id }; _memberContext.Entry(member).State = EntityState.Deleted; try { _memberContext.SaveChanges(); TempData["DeleteMessage"] = "<script>alert('Data Deleted')</script>"; } catch (DbUpdateConcurrencyException) { TempData["DeleteMessage"] = "<script>alert('Record does not exist or was already deleted')</script>"; } return RedirectToAction("MemberList"); }
此方式需确保前端传递的objMember.Id是正确的数据库主键值。
方案3:检查前端数据传递
确保前端表单正确传递实体主键:
@using (Html.BeginForm("Delete", "Member", FormMethod.Post)) { @Html.HiddenFor(m => m.Id) <input type="submit" value="Delete" /> }
或通过路由参数传递主键:
@Html.ActionLink("Delete", "Delete", new { id = Model.Id }, new { onclick = "return confirm('Are you sure?');" })
对应Action方法需改为接收int id参数。
内容的提问来源于stack exchange,提问作者Sendy
相关产品推荐
相关产品推荐

