2016-11-11 79 views
0

我有一個應用程序從一個數據庫讀取數據,並將該數據轉換爲新的表單並將其寫入新的數據庫。新數據庫中的一些表格由舊數據庫中的多個表格構成,因此會有大量的讀寫操作正在進行。下面是該系統的基本概念:實體框架,多線程和事務

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

哇!一個包含有用信息的MSDN頁面!這是一個收藏家的項目。 –