Удаление объекта из виртуальной коллекции или перемещение в другой объект в Entity Framework Code First

У меня есть объект с самоссылающимися родительскими и дочерними отношениями:

[Table("Content")]
public class Content
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ContentID { get; set; }
    public string Text { get; set; }
    public int? ParentID { get; set; }
    public virtual Content Parent { get; set; }
    private ICollection<Content> _contents { get; set; }
    public virtual ICollection<Content> Contents
    {
        get { return _contents ?? (_contents = new HashSet<Content>()); }
        set { _contents = value; }
    }

}

Я пытаюсь работать с функцией редактирования, чтобы при изменении родительского идентификатора объект был правильно удален из дочерних элементов родительского элемента OLD и добавлен к новому (или для него задано нулевое значение)

Я перепробовал несколько комбинаций, чтобы код корректно изменил родительский идентификатор, но я просто не в состоянии взломать правильную вещь, которую нужно сделать здесь.

    [HttpPost]
    public ActionResult Edit(Content content)
    {
        if (ModelState.IsValid)
        {
            Content oldContent = context.Contents
                                        .Where<Content>(c => c.ContentID == content.ContentID)
                                        .Single<Content>();


            // If the parent has changed.
            if (content.ParentID != oldContent.ParentID)
            {
                // if the old parent is not NULL remove from collection
                if (oldContent.ParentID != null) {
                    Content oldParent = context.Contents
                                               .Where<Content>(c => c.ContentID == oldContent.ParentID)
                                               .Single<Content>();
                    oldParent.Contents.Remove(content);
                    context.Entry(oldParent).State = EntityState.Modified;
                    context.SaveChanges();
                }

                // if the new parent is not NULL add to the new collection
                if (content.ParentID != null) {
                    Content parent = context.Contents
                                            .Where<Content>(c => c.ContentID == content.ParentID)
                                            .Single<Content>();
                    parent.Contents.Add(content);
                    context.Entry(parent).State = EntityState.Modified;
                    context.SaveChanges();
                }
            } 
            context.Entry(oldContent).CurrentValues.SetValues(content);
            context.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.PossibleParents = context.Contents;
        return View(content);
    }

Проблема в том, что таблица данных имеет два поля, связанных с ParentID - первое ParentID правильно меняется, второй, Parent_ContentID не является. Второй используется для циклического .Contents собственность от родителя.

Что мне не хватает? Как удалить текущий объект из коллекции "связанных объектов" родительского объекта?

1 ответ

 oldParent.Contents.Remove(oldContent);

Это сработало для меня. Спасибо @ Слаума!

Другие вопросы по тегам