如何让Entity Framework和WCF处理事务?好的......秘诀是什么?

Pre*_*hen 5 oracle wcf entity-framework transactions

我一直在尝试几种不同的方法,以便获得一组简单的事务来处理简单的WCF客户端/服务器情况.我的WCF服务器具有用于数据库访问的Entity Framework类的类级别声明,以及用于修改数据的几种方法和用于SaveChanges的方法.我正在使用Oracle数据访问(ODP.NET).

例如,我想从客户端调用修改,然后单独调用以保存WCF服务中的更改.它不起作用.基本上,一切都运行良好,但是当第二次调用保存更改时,WCF服务不再具有原始上下文,因此不会保存任何更改(因此,之前的调用会自动回滚进行更改) .

我在我的客户端围绕两个操作使用Transaction范围,并在完成后执行Complete().我的WCF服务具有使用的OperationContract [TransactionFlow(TransactionFlowOption.Mandatory)]和那些方法实现使用[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)].最后,我的web配置配置了一个wsHttpBinding,其transactionFlow属性设置为True.

我没有运气.无论我尝试什么,当我尝试点击服务进行后续保存时,EF上下文已经更新.

Lad*_*nka 4

这与交易无关。事务在事务性资源上工作,但如果没有在第一个请求中调用,SaveChanges则没有活动的事务性资源,因为 EF 上下文不是事务的一部分 - 数据库是事务的一部分,并且仅当您调用时数据库才会受到影响SaveChanges。要完成这项工作,您不需要分布式事务。您需要全会话服务并将 EF 上下文存储在服务实例中。如果客户端使用相同的客户端代理实例与服务通信以处理所有请求,则通信将由相同的服务实例 = 相同的 EF 上下文实例处理,该实例将记住先前调用的更改。

恕我直言,这是一个非常糟糕的架构。干脆不要使用它。在 WCF 服务上公开专门的方法,这些方法将进行更改并保存它们。如果您需要在与其他事务资源的事务中执行这些方法,请使用真正的分布式事务。