私は自己参照の親子関係を持つオブジェクトを持っています:
[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 に関連する 2 つのフィールドがあることです。1 つ目ParentID
は正しく変更されていますが、 2 つ目は変更されてParent_ContentID
いません。.Contents
2 つ目は、親からプロパティをループするために使用されます。
私は何が欠けていますか?親の「関連オブジェクト」コレクションから現在のオブジェクトを削除するにはどうすればよいですか?