我有一个用于批量插入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
如果必须的话就会打开连接。
所以我的问题是我是否以正确的方式解决这个问题?
答案 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