EntityFramework中的交易不匹配

时间:2013-08-29 00:47:07

标签: entity-framework transactions

我有一个sproc

CREATE PROCEDURE [dbo].[GetNextImageRequest]
(...) AS

DECLARE @ReturnValue BIT
SET @ReturnValue = 1

-- Set paranoid level isolation: only one access at a time!
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION

BEGIN TRY 
    ...
    UPDATE STATEMENT THAT THROWS FOREIGN KEY EXCEPTION           

    IF @@trancount > 0
    BEGIN
        COMMIT TRANSACTION
    END
    SET @ReturnValue = 0
END TRY

BEGIN CATCH
    IF @@trancount > 0
    BEGIN
        ROLLBACK TRANSACTION
    END
    SET @ReturnValue = 1
END CATCH 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET NOCOUNT ON

RETURN @ReturnValue   -- 0=success

GO

当我从Sql Server Management工作室手动调用时,我没有任何异常。 当我通过Entity Framework 6调用它时,我得到了

  

EXECUTE之后的事务计数表示不匹配的数量   BEGIN和COMMIT语句。先前的计数= 1,当前计数= 0。

我做错了什么?外键约束正在回滚,但我正在检查@@ TRANCOUNT。

2 个答案:

答案 0 :(得分:2)

事实证明,EF6在自己的事务中包装了sproc调用。 解决方法是检查事务是否已经打开,如果尚未打开则只执行BEGIN | COMMIT | ROLLBACK TRANSACTION

答案 1 :(得分:0)

实体框架6(EF6) 在ExecuteSqlCommand之前添加此行

db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;