c#将DbContextTransaction转换为SqlTransaction

时间:2016-07-15 08:48:49

标签: c# entity-framework

我正在尝试在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。

2 个答案:

答案 0 :(得分:10)

您需要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中。

答案 1 :(得分:4)

通过施放UnderlyingTransaction

public void smoothScrollToPosition(RecyclerView recyclerView, State state, int position) {
        Log.e(TAG, "You must override smoothScrollToPosition to support smooth scrolling");
    }