使用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()我得到exceptionTransaction 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 ... 

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

我解决了我的问题。

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

如您所知, COMMIT @@TRANCOUNT递减1.或者更确切地说:

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

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

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

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