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
相关产品推荐
相关产品推荐

