我如何使用SqlBulkCopy从实体框架数据库连接在未知状态
本文关键字:数据库连接 未知 状态 框架 实体 何使用 SqlBulkCopy | 更新日期: 2023-09-27 18:07:58
我有一个用于批量插入实体框架对象的静态助手方法。它可以工作,我的单元测试通过了,但它看起来是错误的,我忍不住想一定有更好的方法来做。
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
可能已经做了一些事情,因此连接可能是打开的。如果在创建大容量副本之前没有显式打开连接,则会出现错误:
系统。InvalidOperationException: WriteToServer需要一个打开的可用连接
这是奇怪的,我本以为sqlBulkCopy
会打开连接,如果它必须。
所以我的问题是我这样做是正确的吗?
我自己就成功地使用过你的方法。
我的感觉是,如果你打开了它,你应该再关上它。
我将另外让SqlBulkCopy
处理事务本身。我不认为在任何环境事务中加入SqlBulkCopy
是一个好主意,除非你的特定场景绝对需要它。
public static void BulkInsert<T>(PandaDataContext db, IList<T> list)
{
var mustOpen = db.Database.Connection.State != ConnectionState.Open;
try
{
if (mustOpen)
db.Database.Connection.Open();
using (var bulkCopy = new SqlBulkCopy((db.Database.Connection) as SqlConnection, SqlBulkCopyOptions.Default))
{
}
}
finally
{
if (mustOpen)
db.Database.Connection.Close();
}
}