1

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

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

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

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

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

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

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

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

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

    scope.Complete();

}

基本上,我的问题如下:

  • 这行得通吗?

  • 这种方法有什么不好的原因吗?

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

4

1 回答 1

1

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

每个对象(Parent和每个Child)都将由一个 DTO 类表示,其中ParentDto具有ChildDos 的集合。您通过一个随后处理的上下文填充父级,每个子级在单独的线程中由他们自己的短期上下文填充。

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

于 2013-05-06T07:01:32.627 回答