Entity framework EF6数据库优先事务和多上下文

Entity framework EF6数据库优先事务和多上下文,entity-framework,transactions,entity-framework-6,bulkinsert,transactionscope,Entity Framework,Transactions,Entity Framework 6,Bulkinsert,Transactionscope,按照中的建议,我正在尝试优化一个save(insert only)操作,该操作通过将save操作拆分为X个记录的批次来处理数千条记录。当然,我希望这些操作成为单个事务的一部分 我们首先使用的是EF6数据库 MSDN有一篇文章介绍了如何打开连接并自己启动事务,将连接传递给DbContext构造函数,然后调用UseTransaction 然而,这似乎并不首先适用于数据库-它一直在调用DbContext.OnModelCreating,这反过来会引发意外的CodeFirstException 即使没有

按照中的建议,我正在尝试优化一个save(insert only)操作,该操作通过将save操作拆分为X个记录的批次来处理数千条记录。当然,我希望这些操作成为单个事务的一部分

我们首先使用的是EF6数据库

MSDN有一篇文章介绍了如何打开连接并自己启动事务,将连接传递给
DbContext
构造函数,然后调用
UseTransaction

然而,这似乎并不首先适用于数据库-它一直在调用
DbContext.OnModelCreating
,这反过来会引发
意外的CodeFirstException

即使没有事务,它也不工作。例如:

using (var conn = new SqlConnection("..."))
using (var context = new BloggingContext(conn, contextOwnsConnection: false))
{
  context.Blogs.Add(blog); // invokes ModelCreating and fails.
  context.SaveChanges(); // never gets this far
}
这个异常实际上建议提供一个
EntityConnection
,因此我尝试了以下方法:

using (var sourceContext = new BloggingContext())
{
  using (var anotherContext = new BloggingContext(
    sourceContext.Database.Connection, // supply existing EntityConnection
    contextOwnsConnection: false))
  {
    context.Blogs.Add(blog); // still fails.
    context.SaveChanges(); // never gets this far
  }
}
使用
TransactionScope
是另一种选择,但不幸的是,由于打开了多个连接,这将不可避免地升级到MSDTC,而这不是一种选择

以下是我尝试优化操作的简化版本。如何首先使用数据库获取每个批次的新上下文以包含在单个事务中?

foreach (List<Blog> blogBatch in blogBatches)
{
  using (var context = new BloggingContext())
  {
    context.Configuration.AutoDetectChangesEnabled = false;
    context.Blogs.AddRange(blogBatch);
    context.SaveChanges();
  }
}
foreach(在blogbatchs中列出blogBatch)
{
使用(var context=new BloggingContext())
{
context.Configuration.AutoDetectChangesEnabled=false;
context.Blogs.AddRange(blogBatch);
SaveChanges();
}
}
编辑:发现似乎处理相同的问题,尽管仍然没有一个有用的答案