【发布时间】:2021-10-13 06:23:05
【问题描述】:
我有一个 C# 核心 Web API 控制器(Microsoft.AspNetCore.Mvc.ControllerBase 的实现),它具有 API 方法 A 和 API 方法 B。A 是异步的,会触发并忘记异步工作线程。 B 是同步的。
A(及其工作线程)和 B 都使用实体框架从同一个数据库中读取和写入。但我遇到的问题是 DBContext 对象在 A 的工作线程完成之前被释放。
我知道一次性对象的所有者应该创建和处置它的原则。所以我考虑将 A 的 DBContext 包装在一个不是一次性的 Repository 类中,但这似乎违反了分析器规则:“CA1001:拥有一次性字段的类型应该是一次性的”-https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1001 但是如果我将 Repository 对象设为一次性,Dotnet当 A 返回时(但在其工作线程完成之前),核心会处理它。
我也考虑过将存储库设为单例,但这违反了 DbContext 对象应该是短暂存在的原则。
感谢您提出的任何建议!
【问题讨论】:
-
是否可以选择使用托管服务?然后托管服务可以拥有自己的 DbContext 实例?
-
@MaartenDev 这是一个有用的建议,但从我所阅读的内容来看,托管服务在服务器的生命周期内运行,显然 DbContext 对象应该是短暂的。当然,我可以拥有一个负责启动工作线程的托管服务,但我认为这让我回到了原点。如果我误解了您的建议,请纠正我。
标签: entity-framework asp.net-core asynchronous dbcontext