外部APIから映画データを取得します。最初のフェーズでは、各映画をかき取り、自分のデータベースに挿入します。2番目のフェーズでは、APIの「変更」APIを使用してデータベースを定期的に更新します。このAPIをクエリして、情報が変更された映画を確認できます。
私のORMレイヤーはEntity-Frameworkです。Movieクラスは次のようになります。
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
この問題は、更新が必要な映画がある場合に発生します。私のデータベースは、追跡されているオブジェクトと、更新API呼び出しから受け取った新しいオブジェクトを、を無視して別のオブジェクトと見なし.Equals()
ます。
これにより、更新されたムービーでデータベースを更新しようとすると、既存のムービーを更新する代わりにデータベースが挿入されるため、問題が発生します。
以前この言語で問題がありましたが、私の解決策は、アタッチされた言語オブジェクトを検索し、それらをコンテキストから切り離し、それらのPKを更新されたオブジェクトに移動して、それをコンテキストにアタッチすることでした。ときにSaveChanges()
今実行され、それは基本的にそれを交換します。
Movie
オブジェクトへのこのアプローチを続けると、映画、言語、ジャンル、キーワードを切り離し、データベースでそれぞれを検索し、IDを転送して、新しいオブジェクト。
これをよりエレガントに行う方法はありますか?理想的には、更新されたムービーをコンテキストに渡し、Equals()
メソッドに基づいて更新する正しいムービーを選択し、そのすべてのフィールドを更新し、各複雑なオブジェクトを更新したい場合:独自のEquals()
メソッドに基づいて既存のレコードを再度使用し、それはまだ存在していません。
アタッチされている.Update()
すべてのオブジェクトの取得と組み合わせて使用できる各複雑なオブジェクトにメソッドを提供することで、デタッチ/アタッチをスキップできますが、それでも、すべての既存のオブジェクトを取得して更新する必要があります。
id
あり、外部APIからの映画は、フィールドを使用してローカルのものと照合されますtmdbid
。映画、ジャンル、言語、キーワードなどに関するものであるため、1回の呼び出しで更新する必要のあるエンティティをすべて取得することはできません。それぞれにPKがあり、データベースにすでに存在している可能性があります。