首页 > 代码库 > 坑到了,EF执行带事物的存储过程

坑到了,EF执行带事物的存储过程

用EF开发项目,今天调用 带事物 存储过程,始终报错,
"EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。\r\nEXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。"。

执行代码如下:

1 public async Task<int> ExecCommandAsync(string functionName, object[] param)2 {3    return await DbContext.Database.ExecuteSqlCommandAsync( functionName, param);4 }

 

在Sql本地执行是不没问题的,但是代码执行就会报错,而且数据是插表成功的。存储过程改了很多也没用。后台,只能反编译EntityFramework.dll,在方法ExecuteSqlCommandAsync():技术分享

红框的意思,大家都看得懂吧,在初始化时EnsureTransactionsForFunctionsAndCommands (官方:此标志确定在事务外部执行方法(如 ExecuteSqlCommand(String, Object[]))时是否将启动新事务。 请注意,这不更改 SaveChanges() 的行为。默认True

所以会启动新事物。导致数据操作成功,代码返回失败。改成:

1  public async Task<int> ExecCommandAsync(string functionName, object[] param)2  {3     return await DbContext.Database.ExecuteSqlCommandAsync(TransactionalBehavior.DoNotEnsureTransaction, functionName, param);4  }

问题成功解决。

坑到了,EF执行带事物的存储过程