坑到了,EF执行带事物的存储过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坑到了,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执行带事物的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
如何在不知道查询结果类型的情况下在 EF/VB.net 中运行存储过程?