我有一个用于批量插入 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/