【问题标题】:DbContext gets disposed during async/await operationsDbContext 在异步/等待操作期间被释放
【发布时间】:2022-11-02 23:22:52
【问题描述】:

我在我的 BackgroundService 中使用数据库上下文,它在异步/等待操作期间被释放:

无法访问已释放的上下文实例。造成这种情况的一个常见原因 错误正在处理已解决的上下文实例 依赖注入,然后尝试使用相同的上下文 在您的应用程序的其他地方实例。如果您是 在上下文实例上调用“Dispose”,或将其包装在 using 陈述。如果你使用依赖注入,你应该让 依赖注入容器负责处理上下文 实例。\n对象名称:“MyDbContext”。

我正在使用 DI:

    services.AddDbContext<MyDbContext>(
        options => options.UseNpgsql(connectionString), 
        contextLifetime: ServiceLifetime.Transient, 
        optionsLifetime: ServiceLifetime.Singleton);

任何像 SaveChangesAsync 这样的 async/await 操作都可能导致 db-context 被释放。 我究竟做错了什么?

【问题讨论】:

  • 可能有几个可能的原因。 async void 可能会导致这种情况,即触发后不管任务,或尝试使用内存中的后台任务处理器。请发布一个完整的示例来重现该问题。

标签: entity-framework async-await


【解决方案1】:

尝试使用 DbContext Pooling 来解决 Db-context 在使用后被丢弃的问题。 Db-Context Pooling 允许您重用已创建的 Db-Context 实例。因此,代码不会每次都创建新实例,而是首先检查池中是否有可用的实例。

   services.AddDbContextPool<MyDbContext>(
    options => options.UseNpgsql(connectionString), 
    contextLifetime: ServiceLifetime.Transient, 
    optionsLifetime: ServiceLifetime.Singleton);

希望这可以帮助 ..

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2018-07-13
    • 2019-01-08
    • 1970-01-01
    • 2015-01-25
    • 2018-06-03
    相关资源
    最近更新 更多