0

를 가상 컬렉션에서 개체를 제거하거나 엔티티 프레임 워크 코드에서 다른 하나로 이동 :내가 자기 참조 부모 자식 관계를 가진 개체가 먼저

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

} 

내가 편집 기능을 작동하려고을 경우 있도록 부모 ID가 변경되면 개체가 OLD 부모의 자식에서 올바르게 제거되고 새 노드에 추가됩니다 (또는 null로 올바르게 설정 됨)

코드를 올바르게 변경하기 위해 여러 가지 조합을 시도했습니다. 신분증은 있지만 여기에서 할 올바른 일을 해독 할 수 없습니다. 제 ParentID 올바르게 변화하고, 상기 제, Parent_ContentID 그렇지 -

[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 관련된 두 개의 필드를 가지고있다. 두 번째 것은 부모로부터 .Contents 속성을 통해 루핑하는 데 사용됩니다.

무엇이 누락 되었습니까? 부모 개체의 "관련 개체"컬렉션에서 현재 개체를 제거하려면 어떻게해야합니까?

+1

'oldParent.Contents.Remove (oldContent);'가 아니어야합니까? – Slauma

+0

예! 그게 다예요 :) 고마워요. –

+0

Protip : 질문을 편집하는 대신 답변을 추가 할 수 있습니다. 제목에 "Solved"를 추가 할 필요는 없습니다. –

답변

0
oldParent.Contents.Remove(oldContent); 

이것은 나를 위해 일했습니다. 고마워, 스루마!