EF4 - 如何将来自不同ObjectContext的实体“附加”在一起,将它们全部保存在同一个事务中?

时间:2011-05-18 14:34:12

标签: entity-framework-4 transactions

我想创建app模块,并希望创建多个EDMX,只需要在特定上下文中所需的表的子集。

E.g。

  • 针对Invoics的EDMX:发票表,InvoiceDetails,客户
  • 订单的EDMX:订单表,OrderDetails,客户

通过这种方式,我可以让事情变得更小,更易于管理(我认为)

但我可能需要创建一个通用模块,对多个实体执行批处理操作,可能分布在多个EDMX上。例如。合并客户端 - 将多个客户端合并到一个客户端(可能是用户多次错误地输入了相同的客户端,或者我想合并两个客户端帐户等)

为此,我想使用ServiceLocator模式

  1. 定义一个接口IClientMerger
  2. 当我创建一个引用客户端的新实体时,我还创建了一个新的IClientMerger处理程序
  3. 当我需要进行重复数据删除时,我加载所有ICLientHandler,并在循环中调用它们,并且它们将旧ClientID替换为已处理实体中的新ClientID(发票中的一个,订单中的一个等)
  4. 一切都很好,但我想把这一切打包在一个交易中,所以所有人都会得到保存。在单独的EDMX中,如何在一次交易中将它们打包?我应该手动创建ADO.NET事务并为所有EDMX调用objectContext.SaveChanges吗?还是有另一种更优雅的方式?

    由于

2 个答案:

答案 0 :(得分:1)

using(TransactionScope tran = new TransactionScope())
{
  //do some work...
  context1.SaveChanges()
  context2.SaveChanges()

  tran.Commit()
}

如果在处理TransactionScope之前没有提交,则事务将自动回滚。

如果MS DTC可用,上下文甚至可以在不同的sql服务器上运行。

答案 1 :(得分:0)

尝试TransactionScope课程。
您将需要必需的TransactonScopeOption