2011-09-20 57 views
1

我有兩個數據庫表,一個用於Events,一個用於RecurrenceRules。事件具有指向RecurrenceRuleID的FK。如何從不同的上下文中將實體保存爲NavigationProperty?

我想要做的就是保存事件,它是來自新上下文的重複規則,但我似乎無法完成此操作。我在想什麼?

using (var context = new ScheduledEventEntities()) 
{ 
    if (obj.EntityKey == null) 
    { 
     context.AddObject(obj.EntityKey.EntitySetName, obj); 
    } 
    else 
    { 
     var existingObject = context.Events.FirstOrDefault(p => p.Ident == obj.Ident); 
     context.ApplyCurrentValues<Event>(obj.EntityKey.EntitySetName, obj); 

     // How do I save obj.RecurrenceRule? 
    } 

    context.SaveChanges(); 
} 
+0

您是否啓用了對象跟蹤? – VdesmedT

回答

2

我會嘗試這種方式:

// ... 
var existingObject = context.Events.Include("RecurrenceRule") 
    .FirstOrDefault(p => p.Ident == obj.Ident); 
context.ApplyCurrentValues<Event>(obj.EntityKey.EntitySetName, obj); 

// 1st case: Relationship to RecurrenceRule has been removed or didn't exist 
if (obj.RecurrenceRule == null) 
    existingObject.RecurrenceRule = null; 
// 2nd case: Relationship to RecurrenceRule must be set or updated 
else 
{ 
    // relationship has changed 
    if (existingObject.RecurrenceRule == null || 
     obj.RecurrenceRule.Id != existingObject.RecurrenceRule.Id) 
    { 
     var existingRecurrenceRule = context.RecurrenceRule 
      .SingleOrDefault(r => r.Id == obj.RecurrenceRule.Id); 
     if (existingRecurrenceRule != null) // RecurrenceRule exists in DB 
     { 
      // Update scalar values 
      context.ApplyCurrentValues<RecurrenceRule>(
       obj.RecurrenceRule.EntityKey.EntitySetName, obj.RecurrenceRule); 
     } 
     else // RecurrenceRule does not exist in DB 
     { 
      // nothing to do, SaveChanges will recognize new RecurrenceRule 
      // and create INSERT statement 
     } 
     // set new relationship 
     existingObject.RecurrenceRule = obj.RecurrenceRule; 
    } 
    else // same relationship: just update scalar values 
    { 
     // Update scalar values 
     context.ApplyCurrentValues<RecurrenceRule>(
      obj.RecurrenceRule.EntityKey.EntitySetName, obj.RecurrenceRule); 
    } 
} 

// ... 

的問題確實是ApplyCurrentValues只關心更新標屬性,但不能導航屬性,所以你必須自己處理更新的導航性能。 (不幸的是,更新分離的對象圖幾乎總是會導致這種乏味的代碼,因爲Entity Framework中沒有內置機制來爲您完成這項工作。)

+1

如果您更新ResourceRule本身,但它會在您更改資源規則引用(更改FK值)時不起作用。 –

+0

我收到以下錯誤:'在ObjectStateManager中找不到與提供的對象的鍵匹配的鍵的對象。驗證提供的對象的關鍵值是否與要應用更改的對象的關鍵值相匹配 – Rachel

+0

@Rachel:Ladislav的評論是真實的,您可能會得到異常,因爲您的關係已更改。我試圖在我的答案中處理其他案例(所有if/else案例可能會更聰明地組合起來,但希望邏輯清晰)。 – Slauma

相關問題