Я рассмотрел несколько похожих вопросов об удалении элементов из дочерних коллекций в EF Core, и у большинства из них нет принятого ответа или ответа, относящегося к EF Core:
https://stackoverflow.com/a/51349007
https://stackoverflow.com/a/49679247
У меня есть класс под названием "Альбомы" и свойство, которое называется "Музыканты".
Когда я загружаю альбомы из базы данных с помощью EF, я включаю свойство Musicians, чтобы коллекция уже отслеживалась EF. Если я добавляю элемент в список «Музыканты» и сохраняю изменения в сущности «Альбом», я замечаю, что он добавляется в таблицу соединений «Музыканты и альбомы», и это прекрасно работает. Для удалений это не имеет никакого эффекта.
Пример:
var albums = repository.LoadAlbumsWithMusicians();
var musicians = CreateNewMusiciansForAlbumOne();
var test = albums.First().Musicians;
test.Clear();
test.AddRange(musicians);
С этим кодом, если составной первичный ключ (MusicianId
, MusicianType
и AlbumId
) для музыканта совпадает с тем, о котором EF уже знает, даже если это фактически другой объект, он ничего не будет делать как известно, это отношение уже существует. Это то, что я ожидаю.
Если первичный ключ не соответствует существующему, он будет рассматриваться как новый объект в коллекции, и новая строка добавляется в базу данных. Это также то, что я ожидаю.
Однако я не могу сделать ничего, что заставило бы EF признать, что элементы, которые ранее были в коллекции [и были удалены], должны быть удалены. В EF6 я просто использовал .Clear () и .AddRange () для обработки этих отношений, а EF обрабатывал вставки и удаления для дочерних отношений. Без явного удаления этих объектов из контекста, как в предлагаемом ответе, https://stackoverflow.com/a/49679247, как я могу обеспечить удаление этих удаленных дочерних элементов из базы данных?