Ho esaminato diverse domande simili sull'eliminazione di elementi da raccolte secondarie in EF Core e la maggior parte non ha una risposta accettata o pertinente per EF Core:
https://stackoverflow.com/a/51349007 https://stackoverflow.com/a/49679247
Ho una classe chiamata "Album" e una proprietà chiamata "Musicisti".
Quando carico Album dal database con EF, includo la proprietà Musicians in modo che la raccolta sia già tracciata da EF. Se aggiungo un elemento all'elenco dei Musicisti e salvi le modifiche sull'entità Album, noto che viene aggiunto alla tabella di giunzione per Musicisti e Album, e questo funziona alla grande. Per le eliminazioni, questo non sembra avere un effetto.
Esempio:
var albums = repository.LoadAlbumsWithMusicians();
var musicians = CreateNewMusiciansForAlbumOne();
var test = albums.First().Musicians;
test.Clear();
test.AddRange(musicians);
Con questo codice, se una chiave primaria composita ( MusicianId
, MusicianType
e AlbumId
) per un musicista corrisponde a una di cui EF conosce già, anche se in realtà è un oggetto diverso, non farà nulla poiché sa che questa relazione esiste già. Questo è quello che mi aspetto.
Se la chiave primaria non corrisponde a una esistente, verrà considerata come un nuovo oggetto nella raccolta e una nuova riga verrà aggiunta al database. Questo è anche quello che mi aspetto.
Tuttavia, non riesco a fare nulla che possa far capire a EF che gli oggetti che erano precedentemente nella collezione [e che sono stati rimossi] dovrebbero essere cancellati. In EF6, ho semplicemente usato .Clear () e .AddRange () per gestire queste relazioni e EF ha gestito gli inserti e le eliminazioni per le relazioni figlio. Senza rimuovere esplicitamente questi oggetti dal contesto come in questa risposta suggerita, https://stackoverflow.com/a/49679247 , come posso garantire che questi elementi figli eliminati vengano rimossi dal database?
Utilizzando l'esempio seguente, diciamo che il nostro "selectedAppender" contiene un record per ID e tutti i dati della tabella di giunzione. Per aggiungere elementi e rimuovere elementi da quella tabella di giunzione, tutto ciò che dobbiamo fare è rappresentarli in un oggetto separato (cancella e aggiungi oggetto).
Una volta che abbiamo un elenco di elementi da eliminare, è semplice come chiamare il metodo "remove".
Fammi sapere se questo non è abbastanza chiaro. Speriamo che aiuti.
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);
});
Uno svantaggio di Linq è che devi affrontare questi tipi di problemi in modo iterativo. Non c'è modo che io sappia fare una cancellazione di massa. Se conosci un modo e puoi migliorarlo, condividilo.