Recupero i dati del film da un'API esterna. In una prima fase, rascherò ogni film e lo inserirò nel mio database. In una seconda fase, aggiornerò periodicamente il mio database utilizzando l'API "Modifiche" dell'API alla quale posso interrogare per vedere quali film sono stati modificati.
Il mio livello ORM è Entity-Framework. La classe Movie si presenta così:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
Il problema sorge quando ho un film che deve essere aggiornato: il mio database penserà all'oggetto da tracciare e a quello nuovo che ricevo dalla chiamata dell'API di aggiornamento come oggetti diversi, ignorando .Equals()
.
Ciò causa un problema perché quando provo ora ad aggiornare il database con il filmato aggiornato, lo inserirò invece di aggiornare il film esistente.
Avevo già avuto questo problema con le lingue e la mia soluzione era quella di cercare gli oggetti linguaggio collegati, staccarli dal contesto, spostare il loro PK sull'oggetto aggiornato e collegarlo al contesto. Quando SaveChanges()
viene eseguito, lo sostituirà essenzialmente.
Questo è un approccio piuttosto puzzolente perché se continuo questo approccio al mio Movie
oggetto, significa che dovrò staccare il film, le lingue, i generi e le parole chiave, cercare ognuno nel database, trasferire i loro ID e inserire il nuovi oggetti.
C'è un modo per farlo in modo più elegante? Idealmente, voglio solo passare il filmato aggiornato al contesto e fare in modo che selezioni il filmato corretto da aggiornare in base al Equals()
metodo, aggiornare tutti i suoi campi e per ogni oggetto complesso: utilizzare nuovamente il record esistente basato sul proprio Equals()
metodo e inserire se non esiste ancora.
Posso saltare il distacco / collegamento fornendo .Update()
metodi su ogni oggetto complesso che posso usare in combinazione con il recupero di tutti gli oggetti collegati, ma ciò richiederà comunque che io recuperi ogni singolo oggetto esistente per poi aggiornarlo.
id
e i film dell'API esterna sono abbinati a quelli locali usando il campo tmdbid
. Non riesco a recuperare tutte le entità che devono essere aggiornate in una chiamata perché si tratta di film, generi, lingue, parole chiave, ecc. Ognuno di questi ha un PK e potrebbe già esistere nel database.