Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF中的DbContext是否应该具有较短的生命周期?_C#_Entity Framework - Fatal编程技术网

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

C# EF中的DbContext是否应该具有较短的生命周期?,c#,entity-framework,C#,Entity Framework,我的服务器上有一些长时间运行的任务。基本上,它们就像预定的任务——它们不时地运行 它们都需要访问数据库,我使用实体框架。每个任务都使用DbContext进行访问 DbContext对象应该在每次运行时重新创建还是重复使用?是的,应该只存在很短的时间。它实际上是你的工作单位 每次使用它时,你都应该创建它。(好吧,你应该注入它,但那是另一个讨论:-) 更新:好吧,我承认“每次使用它时都要创建它”可能会产生误导。我已经习惯了在一个被注入的类上作为一个实例的上下文,所以只为一个请求的生命而存在,所以我

我的服务器上有一些长时间运行的任务。基本上,它们就像预定的任务——它们不时地运行

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

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

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

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


更新:好吧,我承认“每次使用它时都要创建它”可能会产生误导。我已经习惯了在一个被注入的类上作为一个实例的上下文,所以只为一个请求的生命而存在,所以我很难以任何其他方式来思考它@wiktor的答案肯定更好,因为它更正确地表达了您应该“尽早而不是晚些处理”的想法。我应该说“这取决于”因为可能存在两种答案都有效的情况,但是最合理的答案是“上下文应该在不需要时尽快处理”,这在实践中意味着“早一点处置,晚一点处置”

这种回答带来的风险是,新来者有时会得出结论,认为应该尽可能地处理上下文,这有时会导致在连续“使用”的情况下进行代码I审查创建一个上下文,将其用于一个或两个操作,dispose,然后下一行出现另一个上下文。当然也不建议这样做


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

相关(如果不重复…)问题:这不是真的(你的部分回答相互矛盾)。由于上下文是一个工作单元的实现,它应该和完成该工作单元所需的时间一样长。在实际应用中,这可能是相当长的时间。整件事都不是真的,@Dennis,或者只是你提到的那部分?定义一个长时间…分钟,小时…可以有非常不同的工作单元。如果这些单元与对于某些数据访问,通常适合在工作开始时创建上下文(例如,用户已开始编辑某些文档),并在工作完成时处理上下文(用户已按下“保存”按钮)。因此,您建议将DBContext保留几分钟或几小时,以便用户可以编辑某些数据-天哪!我在评论中看不到任何建议。我试图解释的唯一一件事是,在处置上下文时,不可能有精确的建议,因为有许多使用场景。唯一的一件事是,这可能是一个参考点,我这是一个工作时间单位。