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
속성을 통해 루핑하는 데 사용됩니다.
무엇이 누락 되었습니까? 부모 개체의 "관련 개체"컬렉션에서 현재 개체를 제거하려면 어떻게해야합니까?
'oldParent.Contents.Remove (oldContent);'가 아니어야합니까? – Slauma
예! 그게 다예요 :) 고마워요. –
Protip : 질문을 편집하는 대신 답변을 추가 할 수 있습니다. 제목에 "Solved"를 추가 할 필요는 없습니다. –