2011-12-12 86 views
0

這是怎麼了我的域名看起來:EF的DbContext更新實體集合

public abstract class Field 
    { 
     //PK 
     public int FieldId { get; set; }   
     //FK 
     [ForeignKey("FieldConfig")] 
     public int FieldConfigId { get; set; } 
     //Relations 
     public virtual FieldConfig FieldConfig { get; set; } 
    } 

public class FieldConfig 
    { 
     //PK 
     public int FieldConfigId { get; set; } 
     //Columns 
     public string Name { get; set; } 
     //FK 
     [ForeignKey("LabelType")] 
     public int? LabelTypeId { get; set; } 
     //Relations 
     public virtual LabelType LabelType { get; set; } 
     public virtual ICollection<Field> Fields { get; set; } 
    } 

我想要做的是以下幾點: Updata公司一FieldConfig它的領域,這是我嘗試這樣做:

FieldConfig fc = labelTypeRepo.FindById(fieldConfig.LabelTypeId).FieldConfigs.SingleOrDefault(f => f.FieldConfigId == fieldConfig.FieldConfigId); 
      fc.Name = fieldConfig.Name; 
fc.Fields = NewFields; 
labelTypeRepo.SaveChanges(); 

我這樣做時,它在我的數據庫3個新領域,而不是通常的IDS增加了,所以它看起來是這樣的: 1 - 奧德菲爾德 2 - 奧德菲爾德 3 - 奧德菲爾德 4 - 新野 5 - 新野 6 - 新野

然後我第一次嘗試刪除舊的元素是這樣的:

foreach (Field f in fc.Fields.ToList()) 
      ((IObjectContextAdapter)context).ObjectContext.DeleteObject(f); 

奏效,但是當我添加了新的領域,卻得到了一個其他標識明顯...

所以我的問題是如何更新這個集合,而不用添加新的字段,同時保持Id的? (不是說我使用DbContext作爲上下文)

我已經檢查過我總是使用相同的上下文。

Thx的幫助..

回答

0

根據您所提供這裏我有什麼toughts:

fc.Fields = NewFields; 

我不能在任何地方看到這些NewFields集合,但我懷疑他們是不是修改後的版本目前的fc.Fields。如果FieldId是自動生成的,那麼當您使用與舊的相同的ID提供新值時,EF不會修改它們,而是會插入新值。

這裏就是我想你想做的事:

FieldConfig fc = ...; 
fc.Name = fieldConfig.Name; 

foreach(var field in fc.Fields) 
{ 
    /*Modify each field properties with the corresponding properties of Newfields, e.g.: 
     var newField = NewFields.First(nf => nf.FieldId == field.FieldId); 
     field.FieldConfig = newField.FieldConfig; 
    */ 
} 
labelTypeRepo.SaveChanges(); 

希望它能幫助。