0

我正在處理MVC3應用程序,並使用鏈接到Oracle數據庫(11G R2)的實體框架。 我遇到了一個問題,當我試圖在TransactionScope中使用單個對象上下文時。TransactionScope與依賴對象上的對象上下文

下面是代碼:

using (TransactionScope scope = new TransactionScope()) 
{ 
    using (Entities context = new Entities()) 
    { 
     // Right insert 
     T_RIGRIGHT entity1 = new T_RIGRIGHT() 
     { 
      RIGCODE = "test1", 
      RIGINSERTLOGIN = "aco", 
      RIGINSERTDATE = DateTime.Now, 
      RIGUPDATELOGIN = "aco", 
      RIGUPDATEDATE = DateTime.Now 
     }; 

     context.AddToT_RIGRIGHT(entity1); 

     context.SaveChanges(); 

     // Right/Profile insert 
     T_RIPRIGHTPROFILE entity2 = new T_RIPRIGHTPROFILE() 
     { 
      PROID = 3, 
      RIGID = entity1.RIGID, 
      RIPINSERTLOGIN = "aco", 
      RIPINSERTDATE = DateTime.Now, 
      RIPUPDATELOGIN = "aco", 
      RIPUPDATEDATE = DateTime.Now 
     }; 

     context.AddToT_RIPRIGHTPROFILE(entity2); 

     context.SaveChanges(); // SaveChanges fails due to the FK constraint on table 
    } 

    scope.Complete(); 
} 

讓我解釋一下代碼...

首先我創建一個實體,稱爲entity1T_RIGRIGHT元素。 I instanciate a T_RIPRIGHTPROFILE元素使用之前創建的T_RIGRIGHT元素的ID。

第二個context.SaveChanges()執行失敗,異常涉及表T_RIPRIGHTPROFILE(需要T_RIGRIGHT)上的外鍵約束。

希望我的解釋足夠清楚

有什麼辦法可以使它工作嗎?

P.S. :我爲我的英語道歉,因爲它不是我的母語。

回答

0

您試圖分配FK尚未提交到數據庫的實體entity1.RIGID

RIGID = entity1.RIGID, 

如果你看一下使用實體觀察你會看到RIGID默認爲0 - 相反,你應該設置代表FK關係的導航屬性:

RIG = entity1, 

這將使EF正常涉及這些實體,這個使用實體沒有被提交到數據庫還沒有,所以你甚至不需要額外致電。

另外,在你的情況下,你不需要TransactionScope - EF在SaveChanges()內部使用一個交易已經 - 根據您只需要一個電話SaveChanges(),因此無需外部事務範圍的建議修改。

+0

非常感謝您的解釋。它完美的作品。 – Alex