繁体   English   中英

使用Entity Framework在事务内部调用存储过程

[英]Call stored procedure inside transaction using Entity Framework

我正在尝试使用Entity Framework运行以下事务。 在事务范围内,我从DB调用存储过程。

 using (mother_Entities entitiesContext = context.Value)
 {
    using (var transactionScope = new TransactionScope())
    {   
        // a lot of create, insert, update operations goes here
        ...
        entitiesContext.SaveChanges();

        //Execute stored procedure:
        var paramMessage = new ObjectParameter("MESSAGE", "");
        var paramMotherid = new ObjectParameter("MOTHERID", motherProductId);
        var paramTochteridlist = new ObjectParameter("TOCHTER_ID_LIST", string.Join(";", motherIds));
        var paramError = new ObjectParameter("ERROR", typeof(int));
        var paramErrorText = new ObjectParameter("ERR_TEXT", typeof(string));

        entitiesContext.ExecuteFunction("SP_DOCUWARE_UPDATE", paramMessage, paramMotherid,
                                            paramTochteridlist, paramError, paramErrorText);

        ...
        transactionScope.Complete();
     }
 }

entitiesContext.ExecuteFunction()我得到异常Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0 Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0

我的存储过程不使用任何事务,也不调用任何其他函数或过程。 所以我不明白为什么我不能在事务中执行strored过程。

更新:

哦,我在存储过程中发现了这个:

...
    IF @COMMIT = 1
    BEGIN
        IF @CANCEL = 1 
            ROLLBACK
        ELSE
            COMMIT
    END
    ELSE IF @CHECK = 1
        ROLLBACK
    END
...

可能是在抛出提交异常之后。 但是如何逃避这个错误呢?

我解决了我的问题。

在存储过程中有一个ROLLBACKCOMMIT关键字。 但是程序中的任何地方都没有BEGIN TRANSACTION 从一开始,我觉得很奇怪。

如您所知, COMMIT @@TRANCOUNT减1.还是更准确:

如果@@ TRANCOUNT为1,则COMMIT TRANSACTION使自事务开始以来执行的所有数据修改成为数据库的永久部分,释放事务所持有的资源,并将@@ TRANCOUNT减少为0.如果@@ TRANCOUNT大于1,COMMIT TRANSACTION仅将@@ TRANCOUNT减1并且事务保持活动状态。

在我的情况下,我在代码中开始一个事务。 并且程序中的COMMIT正在尝试提交我的事务并递减@@TRANCOUNT但尚未完成。

所以我在存储过程中添加了BEGIN TRANSACTION ,它运行正常。

在提交内部事务(完成)之前,您不能提交外部事务(SaveChanges)。 我怀疑在内部调用SaveChanges也会提交内部事务。 (未验证。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM