【问题标题】:Multiple stored procedure calls in 1 transaction with Entity Framework 5使用 Entity Framework 5 在 1 个事务中调用多个存储过程
【发布时间】:2012-08-23 06:26:55
【问题描述】:

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

“底层提供程序在打开时失败。”

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

Inner Inner 异常:“事务管理器已禁用对远程/网络事务的支持。(来自 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 ...
    }
}

【问题讨论】:

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


    【解决方案1】:

    如果不启用 DTC,则无法执行此操作。

    来自相关SO post

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多