我如何使用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处理事务本身。我不认为在任何环境事务中加入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();
    }
}