Удаление дочерних элементов с помощью EF Core - PullRequest
0 голосов
/ 01 ноября 2018

Я рассмотрел несколько похожих вопросов об удалении элементов из дочерних коллекций в 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, как я могу обеспечить удаление этих удаленных дочерних элементов из базы данных?

1 Ответ

0 голосов
/ 01 ноября 2018

Используя приведенный ниже пример, предположим, что наш «selectedAppender» содержит запись по идентификатору и все данные таблицы соединений. Для добавления элементов и удаления элементов из этой соединительной таблицы все, что нам нужно сделать, - это учесть их в отдельном объекте (удалить и добавить объект).

Как только у нас есть список элементов для удаления, это так же просто, как вызвать метод «удалить».

Дайте мне знать, если это не достаточно ясно. Надеюсь, это поможет.

file_appender selectedAppender = context.file_appender.Find(dto.Id);

int[] ids = dto.Loggers.Where(x => !x.Selected).Select(x => x.Id).ToArray();
var loggers_to_delete = selectedAppender.logger.Where(x => ids.Contains(x.id));
loggers_to_delete.ToList().ForEach(x =>
{
    selectedAppender.logger.Remove(x);
});

ids = dto.Loggers.Where(x => x.Selected).Select(x => x.Id).ToArray();
var loggers_to_add = context.logger.Where(x => ids.Contains(x.id));
loggers_to_add.ToList().ForEach(x =>
{
    selectedAppender.logger.Add(x);
});

Одним из недостатков linq является то, что вы должны подходить к этим типам проблем итеративно. Я не знаю, как выполнить массовое удаление. Если вы знаете способ и можете улучшить его, поделитесь им.

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