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

添加用户时触发DbContext InvalidOperationException异常求助

DbContext并发操作异常排查与解决

异常信息

System.InvalidOperationException: 'A second operation was started on this context instance before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext.

问题场景

添加新用户时触发上述异常,异常发生在页面循环所有用户的环节,已搜索同类问题但未解决。

相关代码

UserOverview.cs

// 添加用户时
var added = await UsersService.AddUser(UserModel);

// 获取所有用户
Users = await UsersService.GetUsers();

UserService.cs

private readonly AppDbContext _context;

public UsersService(AppDbContext context)
{
    _context = context;
}

public async Task<bool> AddUser(Users user)
{
    try
    {
        _context.Users.Add(user);
        await _context.SaveChangesAsync();

        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

public async Task<IEnumerable<Users>> GetUsers()
{
    return _context.Users;
}

Program.cs

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(connectionString));

builder.Services.AddScoped<IUsers, UsersService>();

问题根源与修复方案

  • 问题根源:GetUsers方法标记为async但未执行异步数据库操作,直接返回了_context.Users——这是一个延迟执行的IQueryable对象。当页面循环枚举该集合时,才会触发实际的数据库查询,此时同一DbContext实例可能被多个线程同时调用,从而引发并发操作异常。
  • 修复方法:
    修改GetUsers方法,使用异步方法立即执行查询并返回已加载的集合:
    public async Task<IEnumerable<Users>> GetUsers()
    {
        return await _context.Users.ToListAsync();
    }
    
    这样可以确保数据库查询在GetUsers方法内部完成,避免延迟执行带来的并发问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:28