我有一个应用程序从一个数据库读取数据,并将该数据转换为新的表单并将其写入新的数据库。新数据库中的一些表格由旧数据库中的多个表格构成,因此会有大量的读写操作正在进行。下面是该系统的基本概念:实体框架,多线程和事务
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上下文的事务。有什么建议么?
“我试图避免创建一个完全独立于EF环境的事务” - 为什么? – user469104
@ user469104可能大多是天真的。我承认在交易中很弱,因为我不能允许部分加载,所以增加了它。我假设在EF上下文之外创建一个事务将需要某种特殊的处理。如果我在这方面有错误,那么请做,让我知道。 –