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

本文关键字:生命 周期 中的 DbContext 是否 EF | 更新日期: 2023-09-27 18:32:24

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

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

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

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

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

这种答案带来的风险是,新手有时会得出结论,上下文应该尽可能 otfen 处理,这有时会导致我审查的代码,其中有连续的"使用"创建一个上下文,将其用于一两个操作,处置,然后另一个上下文出现在下一行。当然也不建议这样做。

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

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

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


更新:好的,我接受"每次使用它时创建它"可能会产生误导。我已经习惯于上下文是注入的类上的实例,因此仅在请求的生命周期内存在,以至于我很难以任何其他方式考虑它...... @wiktor的回答肯定更好,因为它更正确地表达了您应该"尽早处置"的想法