【问题标题】:ASP.NET Core transient DbContextASP.NET Core 瞬态 DbContext
【发布时间】:2023-03-21 21:54:01
【问题描述】:


我有多个托管服务,每个都使用数据库。我收到了 DbConcurrencyException,因为所有托管服务都同时使用 dbContext 的同一实例(在应用程序开始时)。
我通过将 dbContext 的生命周期从作用域更改为瞬态解决了这个问题。我真的因此而改变了什么?每次我使用 dbContext 时,应用程序会与数据库连接和断开连接吗?如果没有,还有其他问题吗?

【问题讨论】:

    标签: c# asp.net .net asp.net-core


    【解决方案1】:

    IHostedServiceBackgroundServicesingletons。此外,默认情况下 DBContext(当您运行 AddDbContext 时)是 scoped 服务。因此,在每个托管服务中,您需要使用IServiceScopeFactory 打开一个范围。像这样:

    using var scope = _scopeFactory.CreateScope();
    var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>;
    

    关于您将其注册为transient 时发生了哪些变化的问题。每次注入和调用 DBContext 时,它都会实例化一个新的 DbContext。当服务被作用域时,在one scope期间,如果你要多次调用DBContext,你会得到相同的DBContext实例,这会提高性能,所以也许这就是你需要的?

    【讨论】:

    • 完美!非常感谢你。所以我应该保持 DbContext 的范围,而不是直接将它注入到托管服务中,我应该做你在代码 sn-p 中显示的内容。对吗?
    • @sudoman281 完全正确。另外,请记住,除了注册为单例的实例之外,不要向 IHostedService 注入任何东西,所有作用域/瞬态实例都应通过 IServiceScopeFactory 获取
    • 不知道。非常感谢! :-)
    猜你喜欢
    • 2019-05-11
    • 2017-06-14
    • 1970-01-01
    • 2017-11-12
    • 2019-07-14
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多