2016-11-11 1 views
0

У меня есть приложение, которое считывает данные из одной базы данных и преобразует эти данные в новую форму и записывает их в новую базу данных. Некоторые из таблиц в новой базе данных сделаны из нескольких таблиц в старой базе данных, поэтому происходит большое количество чтения и записи. Вот основная концепция системы:Entity Framework, Multi Threading и транзакции

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. Какие-либо предложения?

+0

«Я пытаюсь избежать создания транзакции, полностью отделенной от контекста EF» - Почему? – user469104

+0

@ user469104 Наверное, в основном из наивности. Я, по общему признанию, слаб с транзакциями, и это добавлено, потому что я не мог позволить частичные нагрузки. Я предполагаю, что для создания транзакции вне контекста EF потребуется некоторая специальная обработка. Если я ошибаюсь в этом, тогда, пожалуйста, дайте мне знать. –

ответ

1

Существует прекрасный обзор транзакций here, в котором объясняется, как использовать транзакции в различных контекстах, некоторые из которых похожи на ваши. Вместо того, чтобы пытаться исправить ваш код как есть, возможно, это поможет модифицированный подход.

Я предполагаю, что вы используете EF6

+0

Whoa! Страница MSDN с полезной информацией! Это предмет коллекционера. –