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

标签 c# sql-server entity-framework transactions

我正在使用 EF 6 Database.SqlQuery 语句来执行存储过程,并实现错误和事务处理,打开和关闭事务(处理多个记录,如果一个记录有错误,仅回滚此,并提交其他任何内容无错误完成)。

List<T> _result = this.Database.SqlQuery<T>(sqlStatement, parameters).ToList();

EF 使用自己的事务来执行 Database.SqlQuery,但是当发生错误时,我回滚到存储过程中,此回滚也适用于 EF 事务。所以我得到以下异常:

System.Data.SqlClient.SqlException (0x80131904): The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.

在这种情况下,如何阻止 EF 使用他自己的事务,或阻止程序关闭 EF 的事务?

最佳答案

我发现在这种情况下,.SqlQuery 命令没有添加额外的事务,但错误是由执行的过程产生到初始执行的存储过程中的(是的有点复杂,但它确实是必需的)。但是,我在使用 .ObjectContext.ExecuteStoreCommand 进行外部 EntityFramework 事务时遇到了这个问题,但我使用 TransactionalBehavior.DoNotEnsureTransaction 行为解决了这个问题。

例如:

        using (INotificationDataContext context = DataContextFactory.Create<INotificationDataContext>())
        {
            result = (context as IObjectContextAdapter).ObjectContext.ExecuteStoreCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
        }

关于c# - EF ef Database.SqlQuery 内部回滚到已执行的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25606994/

相关文章:

c# - 在类型 'x' 上找不到键 'x' 的键成员 'y'

sql - SQL中的东西查询

c# - 保持IEnumerable和ObservableCollection同步

c# - 管理 EntityConnection 生命周期

sql - 从表中多次选择记录

c# - .net core 2.0 Entity Framework 无限嵌套实体

c# - 使用 .NET 从 FileStream 的特定位置读取数据

c# - .NET 6 Rider 解决方案模板

c# - HttpClient 不适用于国际域名

SQL结合Union和Except