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

发布于 2024-11-08 12:42:47 字数 701 浏览 0 评论 0原文

我想要创建模块化应用程序,并且想要创建多个 EDMX,仅包含该特定上下文中所需的表的子集。

例如,

  • 发票的 EDMX:发票表、发票详细信息、客户 订单
  • 的 EDMX:订单表、订单详细信息、客户
  • 等。

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

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

为此,我想使用 ServiceLocator 模式

  1. 定义一个接口 IClientMerger
  2. 并在我创建时一个引用客户端的新实体,
  3. 当我需要重复数据删除时,我还会创建一个新的 IClientMerger 处理程序,我加载所有 ICLientHandler,并在循环中调用它们,它们在处理的实体中用新的 ClientID 替换旧的 ClientID(发票中的一个,订单等中的一个)

一切都很好,但我想将这一切都打包在一个交易中,因此所有内容都会被保存或不保存。在单独的 EDMX 中,如何将它们全部打包到一个事务中?我应该手动创建 ADO.NET 事务并为内部所有 EDMX 调用 objectContext.SaveChanges 吗?或者还有另一种更优雅的方式?

谢谢

I want to create the app modular and would like to create multiple EDMX, with just the subset to tables needed in that specific context.

E.g.

  • an EDMX for Invoics: Invoice table, InvoiceDetails, Customer
  • an EDMX for Orders: Order table, OrderDetails, Customer
  • etc.

This way I keep things smaller and manageable (I think)

But I might need to create a generic module that performs a batch operation on several entities, possible spread across multiple EDMX. E.g. Consolidate clients - merge multiple clients to a single client (maybe users entered same client by mistake multiple times, or I want to merge two client accounts,etc)

For this I want to use ServiceLocator pattern

  1. define an interface, IClientMerger
  2. and as I create a new entity that refer to client, I also create a new IClientMerger handler
  3. when I need to deduplicate, I load all ICLientHandlers, and call them in a loop, and they replace the old ClientID with new ClientID in handled entity (one in Invoices, one in Orders, etc.)

All is fine, but I want to pack this all in a transaction, so all will get saved or not. being in separate EDMX, how can I pack them all in a single transaction? Should I manually create a ADO.NET transaction and call objectContext.SaveChanges for all EDMX inside? Or there's another, more elegant way?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丢了幸福的猪 2024-11-15 12:42:47
using(TransactionScope tran = new TransactionScope())
{
  //do some work...
  context1.SaveChanges()
  context2.SaveChanges()

  tran.Commit()
}

如果在TransactionScope被释放前没有Commit,事务会自动回滚。

如果 MS DTC 可用,这些上下文甚至可以在不同的 SQL 服务器上工作。

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

  tran.Commit()
}

If there's no Commit before the TransactionScope is disposed, the transaction is automatically rollbacked.

The contexts can even work on differents sql servers if MS DTC is available.

丑疤怪 2024-11-15 12:42:47

尝试使用 TransactionScope 类。
您将需要必需的 TransactonScopeOption

Try the TransactionScope class.
You will need the Required TransactonScopeOption.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文