C#如何将DbContextTransaction转换为SqlTransaction?

16

我正在尝试在DbContext下使用SqlBulkCopy。我的Sql连接字符串有UserId和Password,因此为了将连接对象传递给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。


通过将其转换为 SqlTransaction,可能吗? - Ivan Stoev
2个回答

18
你需要一个 dbContext 实例或 IDbTransaction 来获取 UnderlyingTransaction:
DbContext:
var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls,
        (myDbContext.Database.CurrentTransaction.UnderlyingTransaction) as SqlTransaction)) ;

IDbTransaction:

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

SqlTransaction继承自DbTransaction!

注意:

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


1
非常感谢您的回答。让我执行这段代码。 - praveen.upadhyay

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接