c# - 长期使用Entities时在C#中使用EntityFramework

标签 c# entity-framework dbcontext lifetime

我正在努力解决以下问题。

我有一个包含表 Jobs 的数据库,其中包含有关要完成的作业的信息。我遵循 EF 6.0 的代码优先方法并创建了一个名为 Job 的 POCO 类。然后我在数据库中查询作业:

DbSet<Job> receivedJobs;
using (var context = new MyContext())
{
    receivedJobs = (from j in context.Jobs
            select j);
}

有了接收到的集合receivedJobs,然后我将进行耗时的优化。

据我了解,上下文的生命周期以及上下文控制的资源以 using 语句的右括号结束。此外,一个好的设计应该在不再需要数据库时立即释放资源。

我现在的问题是我的情况应该怎么办?只需保持数据库上下文处于事件状态,直到我完成耗时的优化任务。或者关闭连接,因为在优化结束之前不需要它。但在后一种情况下,我该如何处理已处置的 Job 对象,因为我随后需要访问它们的某些导航属性,但由于上下文已关闭,我无法访问这些属性。 (顺便说一下,Job 类的实例中的数据不会因优化而改变。因此不需要跟踪这些对象的更改,因为不会有任何更改)

希望有人能帮助我了解在这种情况下推荐的设计是什么。

最好的问候

最佳答案

您应该始终在执行操作所需的最短时间内保持上下文。在您的情况下,听起来您需要上下文直到优化完成,因为您正在使用它的一些方法来导航结果集。如果是这种情况,那么应该保留上下文,直到您不需要它为止。

要避免的坏习惯是,当你没有立即需要它时,捕获一个上下文。您会看到一些在应用程序启动时错误地创建上下文的应用程序,并在应用程序的整个生命周期内一直保留它。这很糟糕,而且是在浪费资源。

在您的情况下,将优化代码放置到位,使用上下文直到代码完成,然后释放上下文。您的 using 语句将处理所有杂乱的处理内容。只需获取需要 {} 中的上下文以供使用的代码,您就可以开始使用了。

关于c# - 长期使用Entities时在C#中使用EntityFramework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18061019/

相关文章:

c# - 如何为每种产品存储多种尺寸

c# - 从一对多的情况我如何在 Entity Framework 中获得共同的项目

c# - MySQL Connector .NET EF6 运算符 LIKE 不工作

c# - EF6 - 在应用程序配置文件中找不到名为 'Data Source=...' 的连接字符串

c# - 使用 BackgroundWorker 在 GUI 中更新两个(单个操作/总操作)进度条?

c# - WinForm 尝试提交来自 CellValueChanged 事件的 DataGridView 更改

c# - 向 XElement 添加空白行以保留其他格式

entity-framework - 如何在应用 SaveChanges() 之前获取实体中对象的值?

c# - 使用Entity Framework 为什么要重新启动DbContext?

asp.net - 在 Ninject 模块中初始化 EF DbContext 数据库