EF4 - 如何“附加”来自不同 ObjectContext 的实体放在一起,将它们全部保存在同一个事务中?
我想要创建模块化应用程序,并且想要创建多个 EDMX,仅包含该特定上下文中所需的表的子集。
例如,
- 发票的 EDMX:发票表、发票详细信息、客户 订单
- 的 EDMX:订单表、订单详细信息、客户
- 等。
通过这种方式,我可以使事情变得更小且易于管理(我认为)
但是我可能需要创建一个执行批处理的通用模块对多个实体进行操作,可能分布在多个 EDMX 上。例如,合并客户端 - 将多个客户端合并到一个客户端(也许用户多次错误地输入同一个客户端,或者我想合并两个客户帐户等)
为此,我想使用 ServiceLocator 模式
- 定义一个接口 IClientMerger
- 并在我创建时一个引用客户端的新实体,
- 当我需要重复数据删除时,我还会创建一个新的 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
- define an interface, IClientMerger
- and as I create a new entity that refer to client, I also create a new IClientMerger handler
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果在TransactionScope被释放前没有Commit,事务会自动回滚。
如果 MS DTC 可用,这些上下文甚至可以在不同的 SQL 服务器上工作。
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.
尝试使用 TransactionScope 类。
您将需要必需的 TransactonScopeOption。
Try the TransactionScope class.
You will need the Required TransactonScopeOption.