实体框架,多线程和事务

时间:2016-11-11 20:50:43

标签: c# multithreading entity-framework transactions

我有一个应用程序从一个数据库读取数据,并将该数据转换为新表单并将其写入新数据库。新数据库中的某些表是由旧数据库中的多个表组成的,因此会进行大量的读写操作。以下是该系统的基本概念:

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上下文,但我需要它们共享相同的事务。我无法找到一种方法来创建一个新的上下文作为一个孩子&#34;原始的,我试图避免创建一个完全独立于EF上下文的事务。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

交易here有一个很好的概述,它解释了如何在各种环境中使用交易,其中一些环境与您的交易相似。而不是尝试按修复代码,而修改后的方法可能会有所帮助。

我假设您使用的是EF6