长时间使用实体时在C#中使用EntityFramework

时间:2013-08-05 14:43:26

标签: c# entity-framework dbcontext lifetime

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

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

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

使用收到的 receivedJobs 集合,我会花费一些时间进行优化。

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

现在我的问题是我应该怎么做?只需保持数据库上下文活着,直到我完成耗费时间的优化任务。或者在优化结束之前关闭连接,因为它不需要。但在后一种情况下,如何处理已部署的 Job 对象,因为我需要访问它们的一些导航属性,因为上下文已关闭,所以我无法访问它们。 (顺便说一句, Job 类实例中的数据不会被优化改变。所以不需要跟踪这些对象的变化,因为没有)< / p>

希望有人能帮我理解这种情况下的推荐设计。

祝你好运

2 个答案:

答案 0 :(得分:1)

尽管它不会解决你的所有问题,特别是设计问题,你知道“预装”功能会预先加载你工作的导航属性吗? 例如,如果作业指向任务列表,感谢名为“任务”的属性:

  

context.Jobs.Include(“Tasks”)//将预加载的Tasks属性   你的工作。

     

context.Jobs.Include(“Tasks.AllowedUsers”)//将预加载任务   您的工作属性,以及每项任务的AllowedUsers列表。

如果要在同一级别预加载多个属性,只需使用以下内容:

  

context.Jobs.Include( “任务”)。包含( “OtherTasksOnJob”)

答案 1 :(得分:1)

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

要避免的坏习惯是在没有迫切需要的情况下保持上下文。您将看到一些应用程序错误地在应用程序启动时创建上下文并在应用程序的生命周期中保留它。这很糟糕,浪费资源。

在您的情况下,将优化代码放在适当的位置,使用上下文直到代码完成,然后释放上下文。您的使用声明将处理所有混乱的处理东西。只需获取需要{}中使用上下文的代码,您就应该好了。