ASP.NET MVC中更新多表记录时Approval_Status修改失效问题求助
ASP.NET MVC EF更新数据不生效解决方案
问题根因
- 你代码中
new ApprovalParty()是创建了全新的待插入实体,并未关联数据库中已存在的、Id等于PartyId的目标记录 - 未将更新操作告知EF上下文,
SaveChanges()感知不到需要执行的SQL动作,因此更新不会生效
正确实现代码
public ActionResult ApproveRequest(int? id) { // 先判断入参是否合法 if (!id.HasValue) { return RedirectToAction("Index"); } // 查询对应的ApprovalProcess记录,避免空引用异常 var approvalProcess = db.ApprovalProcess.FirstOrDefault(x => x.Req_Id == id.Value); if (approvalProcess == null) { return RedirectToAction("Index"); } int partyId = approvalProcess.Id; // 查询需要更新的ApprovalParty目标记录 var approvalParty = db.Approval_Parties.FirstOrDefault(x => x.Id == partyId); if (approvalParty != null) { // 修改字段值 approvalParty.Approve_Status = true; // 可选:补充审批时间 approvalParty.Approved_Date = DateTime.Now; } // EF会自动追踪实体的修改,调用SaveChanges即可提交更新 db.SaveChanges(); return RedirectToAction("Index"); }
可选优化方案(EF Core 7+ 适用)
如果你的项目使用EF Core 7及以上版本,可以用ExecuteUpdate实现无需查询的直接更新,性能更高:
public ActionResult ApproveRequest(int? id) { if (!id.HasValue) { return RedirectToAction("Index"); } // 单条语句直接更新,不需要先查询实体到内存 db.Approval_Parties .Where(p => p.Id == db.ApprovalProcess.Where(ap => ap.Req_Id == id.Value).Select(ap => ap.Id).FirstOrDefault()) .ExecuteUpdate(p => p.SetProperty(x => x.Approve_Status, true) .SetProperty(x => x.Approved_Date, DateTime.Now)); return RedirectToAction("Index"); }
内容的提问来源于stack exchange,提问作者smc develpments
相关产品推荐
相关产品推荐

