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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:09:04