关于实体框架5和多线程的思考

时间:2013-05-04 22:40:33

标签: .net multithreading entity-framework-5 task-parallel-library c#-5.0

我正在使用带有Entity Framework 5.0和SQL Server 2008的C#(.NET 4.5)中的Visual Studio 2012编写WinForms应用程序。目前,我正在为每个表单使用一个数据库上下文。除了相关的子实体(即实体集合)之外,每个表单都显示单个实体的数据(我将其称为“父实体”):

Parent Entity
     │
     ├─ Child Entities 1
     │
     ├─ Child Entities 2
     │
     ├─ Child Entities 3
     │
     └─ Child Entities 4

不幸的是,我没有与数据库的快速连接,并且需要很长时间(大约30秒,这对于我的用户来说似乎是永远的)来查询数据并填充表单。所以,这就是我的想法:

我不想为每个表单使用一个数据库上下文,而是为Parent实体创建数据库上下文,并为每个子实体集合创建单独的数据库上下文。 我想在不同的线程上创建这些上下文(或者线程池将分配内容)然后在创建后将这些上下文返回到表单。请注意以下条件:

  • 任何时候都不会有多个线程与数据库上下文交互。

  • 单独的数据库上下文将保持独立(即使在返回到主窗体后),它们也不会相互交互。

用户完成所有更改后,我计划为事务中的每个上下文包装SaveChanges()事件:

using (TransactionScope scope = new TransactionScope())
{
    parentContext.SaveChanges();

    childContext1.SaveChanges();
    childContext2.SaveChanges();
    childContext3.SaveChanges();
    childContext4.SaveChanges();

    scope.Complete();

}

基本上,我的问题如下:

  • 这会有效吗?

  • 这种方法有什么理由不好吗?

  • 在这种情况下你会推荐什么?

1 个答案:

答案 0 :(得分:1)

改进可能是使用断开连接的DTO / Viewmodel对象,由多个上下文填充并通过一个新的上下文实例保存更改。

每个对象(Parent和每个Child)都将由DTO类表示,其中ParentDto包含ChildDo s的集合。您可以通过一个上下文填充父项,然后将这些上下文按照自己的短期上下文填充在不同的线程中。

保存更改后,您可以将DTO中的更改写入其实体对应项,并通过为该目标新建的一个上下文进行保存。