使用Entity Framework 5在1个事务中进行多个存储过程调用

时间:2012-08-28 17:30:05

标签: c# entity-framework c#-4.0 asp.net-mvc-4 entity-framework-5

我正在使用Entity Framework 5,需要在单个事务中进行多个存储过程调用。它们都是插入,每个插入都依赖于前一个的输出,我希望能够在一个失败的情况下将所有内容回滚。每个调用使用相同的Entities对象。第一个调用成功执行,但下一个调用总是失败并出现以下错误:

“底层提供商在Open上失败了。”

内部异常:“已禁用分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问。”

内部内部异常:“事务管理器已禁用其对远程/网络事务的支持。(HRESULT异常:0x8004D024)”

有没有办法在没有走DTC道路的情况下做到这一点?

代码:

ObjectParameter outputParam1 = new ObjectParameter("newEntity1", 0);
ObjectParameter outputParam2 = new ObjectParameter("newEntity2", 0);

using (var scope = new TransactionScope())
{
    try
    {
        using(var context = new DatabaseContext())
        {
            context.f_createEntity1(outputParam1);
        }

        using(var context = new DatabaseContext())
        {
            context.f_createEntity2(ouputParam2, outputParam1.Value);
        }

        ... other calls ...

        scope.Complete();
    }
    catch (Exception ex)
    {
        ... handle error ...
    }
}

1 个答案:

答案 0 :(得分:1)

如果没有启用DTC,就无法做到这一点。

来自相关的SO post

  

至少两个支持单阶段通知的持久资源   被列入交易。例如,招募一个人   连接不会导致事务被提升。然而,   每当你打开第二个连接到数据库导致   要登记的数据库,System.Transactions基础结构检测到   它是交易中的第二个持久资源,并且   将其升级为MSDTC交易。