【问题标题】:c# convert DbContextTransaction to SqlTransactionc# 将 DbContextTransaction 转换为 SqlTransaction
【发布时间】:2016-07-15 08:48:49
【问题描述】:

我正在尝试在 DbContext 下使用 SqlBulkCopy。我的 Sql Connection 字符串具有 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

标签: c# entity-framework


【解决方案1】:

您需要 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 的例子一样被加入到 Transaction 中。

【讨论】:

  • 非常感谢您的回答。让我执行代码的和平
【解决方案2】:

通过投射UnderlyingTransaction:

(SqlTransaction)transaction.UnderlyingTransaction

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多