这就是我的域名:
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作为上下文)
我已经检查过我总是使用相同的上下文。
请求帮助..
答案 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();
希望它有所帮助。