2010-10-14 228 views
1

我試圖堅持收集子元素,解決方案有效,但我想問問更有經驗的人,如果方法是正確的?實體框架插入子實體

public bool InsertNewActionHistory(ActionHistory actionHistory) 
    { 
     bool result = false; 

     using (TransactionScope transactionScope = new TransactionScope()) 
     { 
      this.ActionHistories.AddObject(actionHistory); 

      if (actionHistory is ActionUpdate) 
      { 
       foreach (ActionUpdateDetail updateDetail in ((ActionUpdate)actionHistory).ActionUpdateDetails) 
       { 
        ActionUpdateDetails.AddObject(updateDetail); 
       } 
      } 

      this.CommitChanges(); 
      transactionScope.Complete(); 
      result = true; 
     } 

     return result; 
    } 

回答

0

如果ActionUpdateDetail通過導航屬性相關​​,那麼你並不需要的代碼的3/4。您可以這樣做:

public bool InsertNewActionHistory(ActionHistory actionHistory) 
{ 
    this.ActionHistories.AddObject(actionHistory); 
    return true; 
} 

導航屬性確保將相關對象添加在一起。

請注意,如果您使用POCO代理或純POCO,這可能會更困難。與EF的初學者應該堅持數據庫優先或模型優先,直到你學習道路規則。

+0

嗨克雷格,這是一個POCO場景,數據庫第一種方法。不管你是否喜歡它,我已經設法將它排除在外,沒有非常規的代碼。我不知道問題出在哪裏。一開始嘗試孩子,即導航屬性根本不能持續?!然後我決定嘗試使用交易範圍,並以提供的代碼結束。一旦我逐漸刪除了所有不必要的代碼,它就會開始工作。 CommitChanges方法只對上下文的SaveChanges方法進行調用。這可能是因爲交易範圍或其他因素阻止了孩子的拯救。 – bignermo 2010-10-14 13:40:56

+0

我會嘗試返回並重現a behavior行爲,如果成功,我會分享它。無論如何,非常感謝您的幫助:) – bignermo 2010-10-14 13:41:44