ASP.NET MVC 中更新数据表现有记录并新增同ID新记录的实现问题
核心修改点
你原有代码的核心问题是没有触发EF的变更跟踪,也没有执行查询更新原有记录、新增记录的相关操作,修改后的完整代码如下:
public ActionResult ApproveRequest(ApprovalProcess approvalProcess) { if (ModelState.IsValid) { // 增加非空判断避免空引用异常 if (TempData.Peek("CurrentId") == null || approvalProcess.Approvers == null || !approvalProcess.Approvers.Any()) { return View("Index"); } int tempAId = int.Parse(TempData.Peek("CurrentId").ToString()); var currentApprover = approvalProcess.Approvers.First(); // 第一步:查询待更新的现有审批记录 var existingApproval = db.ApprovalParties.FirstOrDefault(x => x.ApprovalProcess_Id == tempAId); if (existingApproval != null) { // 修改EF上下文跟踪的对象属性,会自动标记为待更新状态 existingApproval.Approved_Date = DateTime.Now; existingApproval.Approve_Status = true; // 对应需求的状态值1 existingApproval.Approved_Note = currentApprover.Approved_Note; } // 第二步:新增一条关联同审批ID的新审批记录 var newApproval = new ApprovalParty() { ApprovalProcess_Id = tempAId, Approver_Id = currentApprover.Approver_Id, // 从传入的模型取新审批人ID // 其他字段可按业务需求补充赋值,示例为待审批初始状态 Approved_Date = null, Approve_Status = false, Approved_Note = string.Empty }; // 把新记录加入上下文数据集,标记为待新增状态 db.ApprovalParties.Add(newApproval); // 统一提交所有变更,更新和新增操作在同一事务内执行,保证数据一致性 db.SaveChanges(); return RedirectToAction("Index"); } else { return View("Index"); } }
补充说明
- EF的变更跟踪依赖上下文关联的对象:更新操作需要先查询出上下文正在跟踪的现有对象,修改属性即可自动识别变更;新增操作需要手动把新对象加入对应数据集,才会被识别为待新增数据
- 必须调用
db.SaveChanges()才能把所有变更落库 - 新增的空校验逻辑可根据你的实际业务规则调整
内容的提问来源于stack exchange,提问作者smc develpments
相关产品推荐
相关产品推荐

