У меня есть объект с отношением родителя ребенка самостоятельно ссылающимся:Удаление объекта из виртуальной коллекции или перемещение к другому в 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-родителя и добавляется в новый (или правильно установлен на нуль)
Я пробовал несколько комбинаций, чтобы код правильно изменил родительский 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
от родителя.
Что мне не хватает? Как удалить текущий объект из коллекции связанных объектов родителя?
Не должно быть 'oldParent.Contents.Remove (oldContent);'? – Slauma
ДА! вот и все :) спасибо. –
Protip: вы можете добавить ответ вместо редактирования своего вопроса. Вам не нужно добавлять «Solved» в заголовок. –