c# - 如何在未知状态下从 Entity Framework 数据库连接使用 SqlBulkCopy

标签 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 requires an open and available Connection

这很奇怪,我原以为如果需要,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();
    }
}

关于c# - 如何在未知状态下从 Entity Framework 数据库连接使用 SqlBulkCopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39611827/

相关文章:

.net - WCF - 如何在 JSON 中序列化和反序列化?

c# - 在 .Net 中使用 dbContext 后连接保持打开状态

entity-framework - Entity Framework DB First : Convert Associative Table to Navigation Properties

c# - 统一: how to specify to use specific instance of a type when resolving another type

c# - 基于对象参数的模拟方法返回

.net - 在数据库中删除行后更新 DbSet.Local

c# - Entity Framework 6 - ASP.NET 过滤器 - 并发添加

c# - 如何在linq where子句中比较int和string

c# - 图像在 WPF 功能区控件中无法正确呈现

c# - 为什么 Resharper 无法识别单元测试中引用的项目