2016-11-11 124 views
0

我有一个应用程序从一个数据库读取数据,并将该数据转换为新的表单并将其写入新的数据库。新数据库中的一些表格由旧数据库中的多个表格构成,因此会有大量的读写操作正在进行。下面是该系统的基本概念:实体框架,多线程和事务

public void TransferData() 
{ 
    OldEntities oldContext = new OldEntities() 
    NewEntities newContext = new NewEntities() 
    using(var transaction = newContext.Database.BeginTransaction()) 
    { 
     try{ 
      TransferTable(oldContext, newContext); 
     } catch (Exception e) { 
      transaction.Rollback(); 
     } 
    } 
} 

public void TransferTable(OldEntities oldContext, NewEntities newContext) 
{ 
    List<Entity1> mainTable = oldContext.Where(); 
    Parallel.ForEach(mainTable, (row) => 
     { 
      using(NewEntities anotherNewContext = new NewContext()) 
      { 
       anotherNewContext.Database.UseTransaction(newContext.Database.CurrentTransaction.UnderlyingTransaction); 
       // Do Work 
      } 
     }); 
} 

这将导致以下异常:

中没有与当前连接关联传递的交易。只有与当前连接关联的交易才可以使用。

我该如何解决这个问题。交易总是来自不同的EF环境,但我需要他们共享相同的交易。我无法找到一种方法来创建新的上下文作为原始的“子”,我试图避免创建一个完全独立于EF上下文的事务。有什么建议么?

+0

“我试图避免创建一个完全独立于EF环境的事务” - 为什么? – user469104

+0

@ user469104可能大多是天真的。我承认在交易中很弱,因为我不能允许部分加载,所以增加了它。我假设在EF上下文之外创建一个事务将需要某种特殊的处理。如果我在这方面有错误,那么请做,让我知道。 –

回答

1

有一个很好的交易概述here,它解释了如何在各种情况下使用交易,其中一些类似于你的交易。而不是试图修复你的代码它可能是一个修改后的方法将有所帮助。

我假设你正在使用EF6

+0

哇!一个包含有用信息的MSDN页面!这是一个收藏家的项目。 –