添加用户时触发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
相关产品推荐
相关产品推荐

