我想在我的应用程序中同时支持sql Server和Oracle.
是否可以使用以下代码(在BL中)同时适用于sql Server和Oracle而不升级/跨越到分布式事务(DTC)?
// dbcontext is created before,same dbcontext will be used by both repositories using (var ts = new TransactionScope()) { // create order - make use of dbcontext,possibly to call SaveChanges here orderRepository.CreateOrder(order); // update inventory - make use of same dbcontext,possibly to call SaveChanges here inventoryRepository.UpdateInventory(inventory); ts.Complete(); }
截至今天,2013年8月底,我了解它适用于sql Server 2008 ……但是Oracle呢?我发现这个thread ……看起来甲骨文正在推广分布式交易,但我仍然不清楚.
有没有人有编写应用程序的经验,以支持sql Server和Oracle与实体框架,以启发我?
谢谢!
更新:最后我注意到EF6附带了Improved Transaction Support.除了Remus的建议之外,这可能是我的解决方案.
解决方法
现在谈谈你的问题:不将同一范围内的两个连接提升为DTC的逻辑很大程度上依赖于驱动程序/提供程序合作通知System.Transactions两个不同的连接能够自行管理分布式事务,因为涉及的资源管理者是一样的. sql Server 2008之后的sqlClient是一个能够执行此逻辑的驱动程序.你使用的Oracle驱动程序不是(我不知道任何版本,顺便说一句).
最终真的非常基本:如果你不想要DTC,不要创建一个!确保在范围中使用一个连接.很明显,你不需要两个连接.换句话说,摆脱数据模型中的两个单独的存储库.仅使用一个存储库来存储订单,库存以及其他什么不存在.你正在和他们一起射击自己,你要求的是小精灵粉尘解决方案.
“Transaction and connection association: ODP.NET connections,by default,detach from transactions only when connection objects are closed or transaction objects are disposed”