Ich rufe Filmdaten von einer externen API ab. In einer ersten Phase werde ich jeden Film kratzen und in meine eigene Datenbank einfügen. In einer zweiten Phase werde ich meine Datenbank regelmäßig aktualisieren, indem ich die API "Änderungen" der API verwende, die ich abfragen kann, um festzustellen, bei welchen Filmen die Informationen geändert wurden.
Meine ORM-Schicht ist Entity-Framework. Die Movie-Klasse sieht folgendermaßen aus:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
Das Problem tritt auf, wenn ich einen Film habe, der aktualisiert werden muss: In meiner Datenbank wird das verfolgte Objekt und das neue, das ich vom Update-API-Aufruf erhalte, als unterschiedliche Objekte betrachtet, unabhängig davon .Equals()
.
Dies verursacht ein Problem, da beim Versuch, die Datenbank mit dem aktualisierten Film zu aktualisieren, diese eingefügt wird, anstatt den vorhandenen Film zu aktualisieren.
Ich hatte dieses Problem zuvor mit den Sprachen und meine Lösung bestand darin, nach den angehängten Sprachobjekten zu suchen, sie vom Kontext zu trennen, ihre PK in das aktualisierte Objekt zu verschieben und diese an den Kontext anzuhängen. Wenn SaveChanges()
es jetzt ausgeführt wird, wird es im Wesentlichen ersetzt.
Dies ist ein ziemlich stinkender Ansatz, denn wenn ich diesen Ansatz für mein Movie
Objekt fortsetze, bedeutet dies, dass ich den Film, die Sprachen, die Genres und die Schlüsselwörter trennen, jeden in der Datenbank nachschlagen, ihre IDs übertragen und die einfügen muss neue Objekte.
Gibt es eine Möglichkeit, dies eleganter zu tun? Im Idealfall möchte ich nur den aktualisierten Film an den Kontext übergeben und den richtigen Film auswählen, der basierend auf der Equals()
Methode aktualisiert werden soll, alle Felder aktualisieren und für jedes komplexe Objekt: Verwenden Sie den vorhandenen Datensatz erneut basierend auf seiner eigenen Equals()
Methode und fügen Sie if ein es existiert noch nicht.
Ich kann das Trennen / Anhängen überspringen, indem ich .Update()
Methoden für jedes komplexe Objekt bereitstelle , die ich in Kombination zum Abrufen aller angehängten Objekte verwenden kann. Dazu muss ich jedoch jedes einzelne vorhandene Objekt abrufen, um es dann zu aktualisieren.
id
und die Filme aus der externen API werden mithilfe des Felds mit den lokalen Filmen abgeglichen tmdbid
. Ich kann nicht alle Entitäten abrufen, die in einem Aufruf aktualisiert werden müssen, da es sich um Filme, Genres, Sprachen, Schlüsselwörter usw. handelt. Jede dieser Entitäten hat eine PK und ist möglicherweise bereits in der Datenbank vorhanden.