【发布时间】:2016-11-11 20:50:43
【问题描述】:
我有一个应用程序,它从一个数据库中读取数据,并将该数据转换为一种新形式并将其写入一个新数据库。新数据库中的一些表是由旧数据库中的多个表组成的,因此需要进行大量的读写操作。下面是系统的基本概念:
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 可能主要是出于天真。诚然,我对交易很弱,它被添加是因为我不能允许部分负载。我假设在 EF 上下文之外创建事务需要某种特殊处理。如果我错了,请告诉我。
标签: c# multithreading entity-framework transactions