实体框架 - C# 将 DbContextTransaction 转换为 SqlTransaction

本文关键字:转换 SqlTransaction DbContextTransaction 框架 实体 | 更新日期: 2023-09-27 17:57:01

我正在尝试在DbContext下使用SqlBulkCopy。我的 Sql 连接字符串具有 UserId 和密码,这就是为什么将连接对象传递给 SqlBulkCopy 我正在创建具有 SqlCredential 的 SqlConnection 对象并将 SqlConnection 对象传递给 SqlBulkCopy。我的 SqlBulkCopy 初始化如下所示。

using (var conn = new SqlConnection("", cred))
{
   using (var bulkCopy = new SqlBulkCopy("",SqlBulkCopyOptions.CheckConstraints |
SqlBulkCopyOptions.KeepNulls,DbContext.Database.CurrentTransaction))
   { 
    // bulkCopy code 
   }
 }

但这里的问题是构造函数的第三个参数应该是 SqlTransaction。就我而言,我已经拥有了我的 DbContext,它已与我的服务事务一起登记。

如何将 DbContextTransaction

(DbContext.Database.CurrentTransaction) 转换为 SqlTransaction。

实体框架 - C# 将 DbContextTransaction 转换为 SqlTransaction

你需要一个 dbContext 或 IDbTransaction 的实例来获取底层事务:

数据库上下文:

var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls,
        (myDbContext.Database.CurrentTransaction.UnderlyingTransaction) as SqlTransaction)) ;

IDb交易:

using (IDbTransaction tran = conn.BeginTransaction())
{
  var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls, tran as SqlTransaction);
}

SqlTransaction 继承自 DbTransaction!

注意:

默认情况下,大容量复制操作作为独立操作执行。大容量复制操作以非事务处理方式发生,没有机会回滚。如果需要在发生错误时回滚全部或部分大容量复制,则可以使用 SqlBulkCopy 管理的事务,在现有事务中执行大容量复制操作(如 DbContext 示例中所示,将其作为参数传递是可选的),或者像 IDbTransaction 示例中那样在事务中登记。

通过强制转换底层事务:

(SqlTransaction)transaction.UnderlyingTransaction