Recupero i dati del film da un'API esterna. In una prima fase analizzerò ogni film e lo inserirò nel mio database. In una seconda fase aggiornerò periodicamente il mio database utilizzando l'API "Changes" dell'API che posso interrogare per vedere quali filmati hanno cambiato le loro informazioni.
Il mio livello ORM è Entity-Framework. La classe Movie ha il seguente aspetto:
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 monitorare e quello nuovo che ricevo dall'API di aggiornamento chiamerà come oggetti diversi, ignorando .Equals()
.
Questo causa un problema perché quando cerco di aggiornare il database con il film aggiornato, lo inserirà invece di aggiornare il film esistente.
Ho riscontrato questo problema prima con le lingue e la mia soluzione era quella di cercare gli oggetti lingua allegati, staccarli da il contesto, sposta il PK sull'oggetto aggiornato e lo collega al contesto. Quando SaveChanges()
è ora eseguito, lo sostituirà essenzialmente.
Questo è un approccio piuttosto malefico perché se continuo questo approccio al mio oggetto Movie
, significa che dovrò staccare il film, le lingue, i generi e le parole chiave, cercare ognuno nel database, trasferisci i loro ID e inserisci i nuovi oggetti.
C'è un modo per farlo in modo più elegante? Idealmente, voglio solo passare il film aggiornato al contesto e fare in modo che selezioni il film corretto da aggiornare in base al metodo Equals()
, aggiorni tutti i suoi campi e per ogni oggetto complesso: usa di nuovo il record esistente in base alla sua% metodoEquals()
e inserire se non esiste ancora.
Posso saltare il distacco / collegamento fornendo metodi di .Update()
su ogni oggetto complesso che posso utilizzare in combinazione con il recupero di tutti gli oggetti collegati, ma ciò richiederà comunque che io recuperi ogni singolo oggetto esistente per aggiornarlo.