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

ASP.NET Core控制器Create方法自动新增第二条数据失败问题求解

问题原因

  • 复用了同一个Buchungen实体对象:第一次插入完成后,该实体已经被EF上下文标记为「已持久化」状态,后续修改属性后再次调用Add不会被识别为新记录,只会触发原有记录的更新逻辑。
  • 第二次添加实体后没有调用SaveChangesAsync提交变更,所有未提交的上下文修改都不会写入数据库。
  • 额外的冗余查询:第一次插入完成后,原有buchungen对象已经被EF自动回填了主键、自动生成字段等内容,不需要额外查询LastOrDefault获取刚插入的记录,多一次数据库查询还会有并发风险。

修正代码

推荐采用两次提交的方案,避免自动生成的Belegnummer取值错误:

public async Task<IActionResult> Create([Bind("Id,Bankbeleg,Belegnummer,Datum,Bezeichnung,Zahlungsart,Brutto,...")] Buchungen buchungen)
{
    if (ModelState.IsValid)
    {
        // 插入第一条记录
        _context.Add(buchungen);
        await _context.SaveChangesAsync();

        if (buchungen.Zahlungsart == "PayPal")
        {
            // 新建独立的实体实例,不要复用原有对象
            var secondBuchung = new Buchungen
            {
                Bankbeleg = buchungen.Bankbeleg,
                Belegnummer = buchungen.Belegnummer + 1,
                Datum = buchungen.Datum,
                Bezeichnung = "New Text",
                Brutto = buchungen.Brutto / 10,
                // 其余需要赋值的必填字段请自行补全
            };
            // 插入第二条记录并提交
            _context.Add(secondBuchung);
            await _context.SaveChangesAsync();
        }

        return RedirectToAction(nameof(Index));
    }
    // 原有校验失败后的逻辑
    ...
}

内容的提问来源于stack exchange,提问作者Paul_412

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:30:06