EF DbContext更新实体集合

时间:2011-12-12 19:25:10

标签: c# linq entity-framework

这就是我的域名:

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; }
    }

我想做的是以下内容: 更新一个FieldConfig它的Fields,这是我如何尝试这样做:

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

当我这样做时,它在我的数据库中添加3个新字段而不是普通的ID,所以它看起来像这样: 1 - oldfield 2 - oldfield 3 - oldfield 4 - 纽菲尔德 5 - 纽菲尔德 6 - 纽菲尔德

然后我尝试删除这样的旧元素:

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

虽然有效,但是当我添加新的Fields时,他们明显得到了另一个ID ......

所以我的问题是如何在不保留Id的情况下添加新字段的情况下更新此集合? (不是说我使用DbContext作为上下文)

我已经检查过我总是使用相同的上下文。

请求帮助..

1 个答案:

答案 0 :(得分:0)

基于你在这里提供的内容是我的难点:

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();

希望它有所帮助。