ASP.NET Core 5 + EF Core 操作MySQL添加子项无报错但数据库无数据
问题解决方案
核心错误原因
你代码中的首要问题是异步方法未等待,直接导致数据保存逻辑未实际执行:
- 同步方法
CreateExame内调用了_context.SaveChangesAsync()但未加await关键字,ASP.NET Core请求结束后会自动释放作用域内的DbContext实例,SaveChanges的异步操作还没执行就被终止,因此既无报错也无数据入库。
修复步骤
- 改造业务方法为异步写法
将CreateExame方法从同步void改为异步Task,添加await关键字,同时补充非空判断避免空引用异常:
// 修改方法签名为异步Task public async Task CreateExame(ExameRequest model) { var account = _context.Accounts.SingleOrDefault(x => x.Id == model.AccountId); if (account == null) { // 可根据业务需求抛出异常或返回自定义错误 throw new ArgumentException($"账号ID{model.AccountId}不存在"); } var exame = new Exame(); exame.ExameID = model.Id; exame.Image = model.Image; account.Exames ??= new List<Exame>(); account.Exames.Add(exame); _context.Accounts.Update(account); // 等待保存操作执行完成 await _context.SaveChangesAsync(); }
- 改造控制器接口为异步写法
控制器Action也要对应改为异步,等待业务方法执行完成再返回响应:
[HttpPost("exame")] public async Task<IActionResult> CreateExame(ExameRequest exame) { await _accountService.CreateExame(exame); return Ok(new { message = "Exame added successfully" }); }
其他可能的排查方向
如果修改异步逻辑后仍然无法入库,可依次排查以下问题:
- 主键配置冲突:你在代码中手动给
Exame的主键ExameID赋值,如果对应MySQL表的ExameID字段设置了自增属性,手动赋值会导致EF插入失败。要么关闭表的主键自增,要么代码中不手动给ExameID赋值,由数据库自动生成。 - 事务未提交:如果项目全局开启了事务但没有手动提交,所有修改都会随事务回滚被丢弃,不会写入数据库。
- 开启EF Core日志定位问题:在DbContext配置中添加日志输出,可直接看到EF生成的SQL语句和执行错误:
services.AddDbContext<DataContext>(options => options.UseMySQL("你的数据库连接字符串") .LogTo(Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information));
内容的提问来源于stack exchange,提问作者Anderson Roberto Spiegel
相关产品推荐
相关产品推荐

