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

C# Blazor开发EF Core触发未处理ObjectDisposedException求助

Blazor Server EF Core 异常修复方案

核心代码缺陷

你提供的Insertiket方法存在直接触发异常的异步编写错误:

  • _context.SaveChangesAsync()为异步返回Task的方法,代码未添加await关键字等待执行完成,会在数据库IO操作实际启动前直接返回true。此时依赖注入容器管理的Scoped生命周期DbContext会因为请求/电路逻辑执行完毕被提前释放,后续实际触发数据库操作时拿到的是已释放的上下文实例,直接抛出ObjectDisposedException。
  • 未被捕获的异步释放异常会传导到Blazor Server的SignalR电路层,触发ConnectCircuit调用失败的日志;同时因为上下文提前释放,数据库连接未被正确持有,会连带抛出LocalDB连接失败的20004事件日志,你观察到的"SaveChangesAsync()方法尚未执行就触发异常"就是方法提前返回、上下文生命周期提前终止导致的时序问题。

立即修复方案

修正异步方法写法,添加await关键字等待数据库操作完成:

public async Task<bool> Insertiket(Eintrage eintag)
{
    _context.Eintrage.Add(eintag);
    await _context.SaveChangesAsync();
    return true;
}

后续校验项

修复代码后如果仍存在异常,按以下顺序排查:

  • 校验DbContext生命周期注册:Blazor Server场景下DbContext必须注册为Scoped生命周期,禁止注册为Singleton,避免跨电路复用上下文导致的并发/释放问题,标准注册代码如下:
builder.Services.AddDbContext<WikiDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
  • 校验LocalDB运行状态:打开命令提示符执行sqllocaldb i MSSQLLocalDB确认实例状态,若实例停止则执行sqllocaldb s MSSQLLocalDB手动启动,同时确认项目对LocalDB对应的mdf数据库文件有读写权限。
  • 校验服务注入方式:所有DbContext实例必须通过依赖注入获取,不要在代码中手动new上下文实例;如果需要在长生命周期服务中使用DbContext,改用IDbContextFactory<TContext>创建短生命周期上下文实例,使用完手动释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:01:13