首页 > 代码库 > 坑到了,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执行带事物的存储过程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。