【问题标题】:Entity Framework, Multi Threading, and Transactions实体框架、多线程和事务
【发布时间】: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


【解决方案1】:

事务here 有一个很好的概述,它解释了如何在各种情况下使用事务,其中一些与您的情况相似。与其尝试按原样修复您的代码,修改方法可能会有所帮助。

我假设您使用的是 EF6

【讨论】:

  • 哇!一个包含有用信息的 MSDN 页面!那是收藏品。
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
相关资源
最近更新 更多