Saya mengambil data film dari API eksternal. Pada fase pertama saya akan mengikis setiap film dan memasukkannya ke dalam database saya sendiri. Pada tahap kedua saya akan memperbarui basis data saya secara berkala dengan menggunakan API "Perubahan" API yang dapat saya minta untuk melihat film apa yang informasinya diubah.
Lapisan ORM saya adalah Entity-Framework. Kelas Film terlihat seperti ini:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
Masalah muncul ketika saya memiliki film yang perlu diperbarui: database saya akan menganggap objek yang dilacak dan yang baru yang saya terima dari panggilan API pembaruan sebagai objek yang berbeda, mengabaikan .Equals()
.
Ini menyebabkan masalah karena ketika saya sekarang mencoba untuk memperbarui database dengan film yang diperbarui, itu akan memasukkannya daripada memperbarui Film yang ada.
Saya memiliki masalah ini sebelumnya dengan bahasa dan solusi saya adalah untuk mencari objek bahasa yang dilampirkan, melepaskan mereka dari konteks, memindahkan PK mereka ke objek yang diperbarui dan melampirkannya ke konteks. KapanSaveChanges()
sekarang dieksekusi, pada dasarnya akan menggantinya.
Ini adalah pendekatan yang agak bau karena jika saya melanjutkan pendekatan ini ke saya Movie
objek , itu berarti saya harus melepaskan film, bahasa, genre dan kata kunci, mencari masing-masing dalam database, mentransfer ID mereka dan memasukkan benda baru.
Apakah ada cara untuk melakukan ini dengan lebih elegan? Idealnya saya hanya ingin meneruskan film yang diperbarui ke konteks dan memilih film yang benar untuk diperbarui berdasarkan Equals()
metode, memperbarui semua bidangnya dan untuk setiap objek yang kompleks: gunakan catatan yang ada lagi berdasarkan pada sendiriEquals()
metode dan masukkan jika itu belum ada.
Saya dapat melewati detaching / attaching dengan memberikan .Update()
metode pada setiap objek kompleks yang dapat saya gunakan dalam kombinasi mengambil semua objek yang dilampirkan tetapi ini masih akan mengharuskan saya untuk mengambil setiap objek yang ada untuk kemudian memperbaruinya.
id
dan film dari API eksternal dicocokkan dengan yang lokal menggunakan bidang tmdbid
. Saya tidak dapat mengambil semua entitas yang perlu diperbarui dalam satu panggilan karena ini tentang film, genre, bahasa, kata kunci, dll. Masing-masing memiliki PK dan mungkin sudah ada dalam database.