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 发生更改,则该对象会从旧父级的子级中正确删除并添加到新的(或正确设置为 null)

为了使代码正确更改父 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来自父级的属性。

我错过了什么?如何从父对象的“相关对象”集合中删除当前对象?

4

1 回答 1

0
 oldParent.Contents.Remove(oldContent);

这对我有用。谢谢,@Slauma!

于 2013-03-12T17:44:38.420 回答