0

У меня есть объект с отношением родителя ребенка самостоятельно ссылающимся:Удаление объекта из виртуальной коллекции или перемещение к другому в 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-родителя и добавляется в новый (или правильно установлен на нуль)

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

[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);'? – Slauma

+0

ДА! вот и все :) спасибо. –

+0

Protip: вы можете добавить ответ вместо редактирования своего вопроса. Вам не нужно добавлять «Solved» в заголовок. –

ответ

0
oldParent.Contents.Remove(oldContent); 

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

Смежные вопросы