如何在未知状态下使用来自Entity Framework数据库连接的SqlBulkCopy

时间:2016-09-21 08:54:32

标签: c# .net entity-framework

我有一个用于批量插入Entity Framework对象的静态帮助器方法。它工作正常,我的单元测试通过但它看起来不对,我不禁想到必须有更好的方法来实现它。

public static void BulkInsert<T>(Entities db, IList<T> list)
{
    SqlTransaction transaction =  db.Database.CurrentTransaction != null ? db.Database.CurrentTransaction.UnderlyingTransaction as SqlTransaction : null;

    if (db.Database.Connection.State != ConnectionState.Open)
    {
        db.Database.Connection.Open();
    }

    using (var bulkCopy = new SqlBulkCopy((db.Database.Connection) as SqlConnection, SqlBulkCopyOptions.Default, transaction))
    {
        //fill a datatable and write to server, this bit works
    }
}

可以在DbContextTransaction内调用和/或DbContext.Database可能已经完成某项操作,因此连接可能已打开。如果在创建批量复制之前未明确打开连接,则会收到错误:

  

System.InvalidOperationException:WriteToServer需要一个开放且可用的连接

这很奇怪,我认为sqlBulkCopy如果必须的话就会打开连接。

所以我的问题是我是否以正确的方式解决这个问题?

1 个答案:

答案 0 :(得分:4)

我自己成功地使用了你的方法 我的感觉是,如果打开它,你应该再次关闭它。

我还要让Failed to start Crashlytics java.lang.NoClassDefFoundError: io.fabric.sdk.android.Kit[] at com.example.lb.MyApplication.attemptToStartCrashylitics(MyApplication.java:39) at com.example.lb.MyApplication.startCrashlytics(MyApplication.java:91) at com.example.lb.MyApplication.onCreate(MyApplication.java:80) ... FATAL EXCEPTION: main Process: com.geico.mobile, PID: 3460 java.lang.NoClassDefFoundError: com.example.lb.MyBootstrapStarter at com.example.lb.MyApplication.bootstrapApplication(MyApplication.java:49) at com.example.lb.MyApplication.onCreate(MyApplication.java:81) 处理交易本身。除非您的特定情况绝对需要,否则我认为将SqlBulkCopy加入任何环境交易都是一个好主意。

SqlBulkCopy