Удаление объекта из виртуальной коллекции или перемещение в другой объект в 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 и добавлен к новому (или для него задано нулевое значение)
Я перепробовал несколько комбинаций, чтобы код корректно изменил родительский идентификатор, но я просто не в состоянии взломать правильную вещь, которую нужно сделать здесь.
[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);
Это сработало для меня. Спасибо @ Слаума!