我正在使用带有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();
}
基本上,我的问题如下:
这会有效吗?
这种方法有什么理由不好吗?
在这种情况下你会推荐什么?
答案 0 :(得分:1)
改进可能是使用断开连接的DTO / Viewmodel对象,由多个上下文填充并通过一个新的上下文实例保存更改。
每个对象(Parent
和每个Child
)都将由DTO类表示,其中ParentDto
包含ChildDo
s的集合。您可以通过一个上下文填充父项,然后将这些上下文按照自己的短期上下文填充在不同的线程中。
保存更改后,您可以将DTO中的更改写入其实体对应项,并通过为该目标新建的一个上下文进行保存。