在这里的一个简单示例中,这个问题不容易重现,但是想知道是否有人有任何经验和技巧,这是问题所在:


使用实体框架
在应用程序中有许多要点,其中(1)数据被写入某些实体表,例如客户,将(2)数据写入历史记录表
这两个操作都使用实体框架,但是,它们使用不同的上下文
这些动作必须都在一个事务中进行:即,如果一个动作无法写入,另一个动作则不应写入,等等。
我可以用TransactionScope包装它们,


像这样:

using (TransactionScope txScope = new TransactionScope()) {
    ...
}


但这给了我:


Microsoft分布式事务处理协调器(MSDTC)已被禁用
网络交易。


我们的数据库管理员告诉我,MSDTC被选择禁用,无法安装。

因此,我正在尝试使用MetadataWorkspace创建自己的EntityConnection进行更改,以使每个上下文都将使用相同的EntityConnection。然而,事实证明,试图使其工作几乎是不可能的,例如目前,即使理论上两个上下文都使用EntityConnection,我仍会继续遇到上述错误。例如,很难理解Entity Framework在何处/为什么需要MSDTC。

有没有人走过这条路,有经验或代码示例可以分享?

最佳答案

好吧,这个问题很容易。

如果您使用的是sql server 2008,则应该不会出现此问题,因为您的事务可以升级,并且.NET知道您正在使用相同的持久性存储(数据库),因此它不会将其升级为DTC并将其提交为本地。 look into promotable transaction with sql server 2008.

据我所知,Oracle正在其驱动程序中支持可升级事务,但是我不知道状态,MS oracle驱动程序不支持它。
http://www.oracle.com/technology/tech/windows/odpnet/col/odp.net_11.1.0.7.20_twp.pdf

如果您使用的驱动程序不支持可升级事务,则.NET无法使用本地事务进行两个连接。您应该更改体系结构或说服数据库管理员安装MSDTC。

关于entity-framework - 如何在没有MSDTC的情况下在TransactionScope内运行两个 Entity Framework 上下文?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2370434/

10-11 11:16