Je récupère les données du film à partir d'une API externe. Dans une première phase, je vais gratter chaque film et l'insérer dans ma propre base de données. Dans une deuxième phase, je mettrai périodiquement à jour ma base de données en utilisant l'API "Changes" de l'API que je peux interroger pour voir quels films ont vu leurs informations modifiées.
Ma couche ORM est Entity-Framework. La classe Movie ressemble à ceci:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
Le problème se pose lorsque j'ai un film qui doit être mis à jour: ma base de données considérera l'objet suivi et le nouveau que je reçois de l'appel de l'API de mise à jour comme des objets différents, sans tenir compte .Equals()
.
Cela provoque un problème car lorsque j'essaie maintenant de mettre à jour la base de données avec le film mis à jour, il l'insérera au lieu de mettre à jour le film existant.
J'ai déjà rencontré ce problème avec les langues et ma solution était de rechercher les objets de langage attachés, de les détacher du contexte, de déplacer leur PK vers l'objet mis à jour et de l'attacher au contexte. Une SaveChanges()
fois exécuté, il le remplacera essentiellement.
C'est une approche plutôt malodorante car si je continue cette approche de mon Movie
objet, cela signifie que je devrai détacher le film, les langues, les genres et les mots-clés, rechercher chacun dans la base de données, transférer leurs identifiants et insérer le de nouveaux objets.
Existe-t-il un moyen de le faire plus élégamment? Idéalement, je veux simplement passer le film mis à jour au contexte et sélectionner le film correct à mettre à jour en fonction de la Equals()
méthode, mettre à jour tous ses champs et pour chaque objet complexe: utiliser à nouveau l'enregistrement existant en fonction de sa propre Equals()
méthode et insérer si il n'existe pas encore.
Je peux ignorer le détachement / attachement en fournissant des .Update()
méthodes sur chaque objet complexe que je peux utiliser en combinaison avec la récupération de tous les objets attachés, mais cela me demandera toujours de récupérer chaque objet existant pour le mettre à jour.
id
et les films de l'API externe sont mis en correspondance avec ceux locaux en utilisant le champ tmdbid
. Je ne peux pas récupérer toutes les entités qui doivent être mises à jour en un seul appel, car il s'agit de films, de genres, de langues, de mots clés, etc. Chacun d'eux a un PK et peut déjà exister dans la base de données.