Удаление дочерней сущности из родительской сущности - EF Core 2.2 - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы удалить элемент из коллекции, которая существует в одной сущности.Проблема, с которой я сталкиваюсь:

- объект удаляется из контекста

- после сохранения изменений объект все еще существует

Родительский объект:

public class MyObject
{
    public int Id { get; private set; }
    public ICollection<ChildObject> ChildObjcets { get; private set; }

    public void RemoveChildObject(ChildObject @object)
    {
        this.ChildObjcets.Remove(@object);
    }
}

Дочерний объект:

 public class ChildObject
 {
    public int Id { get; private set; }

    public MyObject MyObject { get; set; }
    public int MyObjectId { get; set; }
}

Что я пробовал:

public void Proceed()
{
     //myObject contain 4 child objects inside
     var myObject = _repo.GetMyObject();
     var childObject = _repo.GetChildObject();

     myObject.RemoveChildObject(childObject);
    //myObject contain 3 items now

}

Перед сохранением изменений не вижуудаленный объект в трекере изменений - состояние должно быть удалено?

var childObjects = ChangeTracker.Entries().Where(x => x.Entity is ChildObject).ToList(); // returns 3 - the removed one does not exist

Однако, когда я сохраняю изменения, корневой объект все еще содержит 4 объекта - таким образом, дочерний объект вообще не был удален

_repo.SaveChanges();       
var myObject = _repo.GetMyObject();

Есть идеи, как обработать удаление дочернего объекта из корневого объекта?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Удаление коллекции ChildObject из ChildObjcets (также обратите внимание на опечатку) означает удаление отношения, а не удаление объекта из DbContext.Чтобы полностью удалить сущность, вам нужно явно вызвать Remove для DbSet<ChildObject>, что вы не можете сделать напрямую из корневого объекта.

Я предлагаю перенести эту операцию на ваш _repo независимо от того, на что она действительно ссылается.Он должен иметь доступ к DbContext, следовательно, к любому DbSet<>.

0 голосов
/ 19 декабря 2018

В Entity Framework 6 более быстрый способ выполнить операцию -

context.Children.RemoveRange(parent.Children)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...