2012-02-03 66 views
4

我們在一個ASP.NET應用程序中使用EF 4.2,該應用程序通過Oracle的EF提供程序鏈接到Oracle 11g數據庫。 父表稱爲CASE_PHASE並具有稱爲ID的主鍵。子表稱爲CASE_STAGE,並具有稱爲ID的主鍵。插入前觸發器插入的主鍵。這個question意味着觸發器可能是問題。使用oracle插入父項與子項的實體框架

此代碼看起來像我在Julia Lerman的書中找到的樣本,但只插入一個新的CASE_PHASE。沒有例外拋出,但沒有插入孩子。

//from the controllers CREATE with hard coded values for testing purposes 
     // POST: /CasePhase/Create 

     [HttpPost] 
     public ActionResult Create(CASE_PHASE case_phase) 
     { 


      var caseStage = new CASE_STAGE 
           { 
            CREATED_BY_USER_ID = 1604, 
            LAST_MODIFIED_BY_USER_ID = 1604, 
            CURRENT = 1, 
            STAGE_ID = 1752, 
            DATE_CREATED = DateTime.Now, 
            DATE_LAST_MODIFIED = DateTime.Now 
           }; 

      if (ModelState.IsValid) 
      { 
       //join new stage to phase 
       caseStage.CASE_PHASE = case_phase; 
       //attach linked entities to context 
       //debugging shows case_phase has the values it needs 
       //but caseStage does not 
       db.CASE_PHASE.Attach(case_phase); 
       db.CASE_PHASE.Add(case_phase); 
       db.SaveChanges(); 

我錯過了什麼?

回答

3

在看到有關未更改StoreGeneratedPattern =「Identity」的錯誤後,我確信Visual Studio有Service Pack 1。現在,所有主鍵都可以在模型中正確識別。

序列已創建。修改StoreGeneratedPattern後,我不得不修改觸發器,以便在主鍵爲空時插入。在代碼中設置主鍵的值無關緊要。如果主鍵具有Identity模式,則EF不會將值發送到數據庫。

這工作,但它是愚蠢的,兩次提交了一個鏈接交易

 if (ModelState.IsValid) 
     { 
      //add the parent entity 
      db.CASE_PHASE.Add(case_phase); 
      db.SaveChanges(); 
      //add new child 
      var caseStage = new CASE_STAGE(); 
      //...more variables initialized 
      //and add the foreign key to the child 
      caseStage.CASE_PHASE_ID = case_phase.ID; 
      db.CASE_STAGE.Add(caseStage); 
      db.SaveChanges(); 
      return RedirectToAction........ 
     } 

使用ADO的DbContext和Oracle實體框架Beta版(我不希望在產能的釋放,現在是不同的行爲因爲Oracle使用的觸發器/序列想法似乎與EF沒有很好的搭配。

或者,您可以將ID字段保留爲StoreGeneratedPattern的默認設置,然後從第e數據庫使用Database.SqlQuery。將其添加到父項,然後將其作爲外鍵添加到子項。

你可以選擇:從dual和db.SaveChanges中選擇一個序列,它至少遵守原子事務或兩個db.SaveChanges的想法。

0

開拓.edmx文件的XML編輯器並查找以下面的行開始的部分:

<!-- SSDL content --> 

下面應該是的EntityType代碼,並在它的數據庫表的定義。爲您的ID列添加屬性時,其中包含StoreGeneratedPattern =「Identity」。

相關問題