EF DbContext обновить коллекцию сущностей - PullRequest
0 голосов
/ 12 декабря 2011

Вот так выглядит мой домен:

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 на его поля, вот как я пытаюсь это сделать:

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

, когда я делаю это, он добавляет в мою базу данных 3 новых поля вместо обычных идентификаторов, поэтому это выглядит так: 1 - oldfield 2 - oldfield 3 - oldfield 4 - newfield 5 - newfield 6 - newfield

затемСначала я попытался удалить старые элементы, например:

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

, который работал, но когда я добавил новые поля, они, очевидно, получили другой идентификатор ...

Так что мой вопрос: как я могуобновить эту коллекцию без добавления новых полей при сохранении идентификаторов?(не то чтобы я использовал DbContext в качестве контекста)

Я уже проверил, что я всегда использую один и тот же контекст.

Спасибо за помощь ..

1 Ответ

0 голосов
/ 04 января 2012

Исходя из того, что вы указали здесь, мои рекомендации:

fc.Fields = NewFields;

Я нигде не вижу этих NewFields коллекций, но подозреваю, что они не являются модифицированной версией текущего поля fc.Fields.Если FieldId генерируется автоматически, когда вы предоставляете новые значения с теми же идентификаторами, что и у старых, 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();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...