实体框架,多线程和事务

本文关键字:事务 多线程 框架 实体 | 更新日期: 2023-09-27 18:17:36

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

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上下文的事务。有什么建议吗?

实体框架,多线程和事务

这里有一个很好的事务概述,它解释了如何在各种上下文中使用事务,其中一些与您的上下文中类似。而不是试图修复你的代码,它可能是一个修改的方法会有所帮助。

我假设你使用的是EF6