EF 中的 DbContext 是否应该具有较短的生命周期?

Dar*_*n V 5 c# entity-framework

我的服务器上有一些长时间运行的任务。基本上它们就像计划任务 - 它们不时运行。

他们都需要访问数据库,我为此使用实体框架。每个任务都使用一个 DbContext 进行访问。

应该在每次运行时重新创建 DbContext 对象还是应该重用它?

Wik*_*hla 6

我应该说“这取决于”,因为可能存在两种答案都有效的情况,但最合理的答案是“上下文应该在不需要时立即处理”,这在实践中意味着“宜早不宜迟”。

来自这样的答案的风险是,新人有时会得出结论,应该尽可能地处理上下文,这有时会导致我审查的代码,其中有连续的“使用”创建上下文,将其用于一两个操作, dispose 然后下一行出现另一个上下文。这当然也不推荐。

对于 Web 应用程序,自然生命周期与 Web 请求的生命周期相关联。在系统服务/其他长时间运行的应用程序的情况下,生命周期策略之一是“每个业务流程实例”/“每个用例实例”,其中业务处理/用例实现定义了自然边界,其中单独的上下文实例有意义。


Pau*_*bra 1

是的,DbContext应该只存在很短的时间。它实际上是您的工作单元

您绝对应该在每次使用它时创建它。(好吧,你应该注入它,但这是另一个讨论:-))


更新:好的,我承认“每次使用它时都创建它”可能会产生误导。我已经习惯了 context 是注入类的实例,因此只在请求的生命周期内存在,我很难以其他方式思考它...... @wiktor 的答案肯定更好,因为它更正确地表达你应该“宜早不宜迟”的想法