坑到了,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执行存储过程并且返回DataSet

如何在不知道查询结果类型的情况下在 EF/VB.net 中运行存储过程?

关于EF执行返回表的存储过程

MVC5加EF6 执行存储过程 获取表

EF ef Database.SqlQuery 内部回滚到执行的存储过程

EF执行SQL语句和存储过程