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

ASP.NET Core 5 + EF Core 操作MySQL添加子项无报错但数据库无数据

问题解决方案

核心错误原因

你代码中的首要问题是异步方法未等待,直接导致数据保存逻辑未实际执行:

  • 同步方法CreateExame内调用了_context.SaveChangesAsync()但未加await关键字,ASP.NET Core请求结束后会自动释放作用域内的DbContext实例,SaveChanges的异步操作还没执行就被终止,因此既无报错也无数据入库。

修复步骤

  1. 改造业务方法为异步写法
    将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();
}
  1. 改造控制器接口为异步写法
    控制器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:39:02