Film verilerini harici bir API'dan alıyorum. İlk aşamada her filmi kazımak ve kendi veritabanına yerleştirmek istiyorum. İkinci aşamada, hangi filmlerin bilgilerinin değiştiğini görmek için sorgulayabileceğim API'nın "Değişiklikler" API'sını kullanarak veritabanımı düzenli olarak güncelleyeceğim.
ORM katmanım Entity-Framework. Movie sınıfı şuna benzer:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
Sorun, güncellenmesi gereken bir filmim olduğunda ortaya çıkar: veritabanım izlenen nesneyi ve güncelleme API çağrısından aldığım yeni nesneyi göz ardı ederek farklı nesneler olarak düşünecektir .Equals()
.
Bu, soruna neden olur, çünkü veritabanını güncelleştirilmiş filmle güncellemeye çalıştığımda, varolan Filmi güncellemek yerine onu ekleyecektir.
Bu sorunu daha önce dillerle yaşadım ve çözümüm ekli dil nesnelerini aramak, onları bağlamdan ayırmak, PK'larını güncellenmiş nesneye taşımak ve bunu bağlama eklemekti. Ne zaman SaveChanges()
şimdi yürütülür, aslında değiştirecektir.
Bu oldukça kokulu bir yaklaşım çünkü nesneme bu yaklaşıma devam Movie
edersem, filmi, dilleri, türleri ve anahtar kelimeleri ayırmam, veritabanındaki her birini aramam, kimliklerini aktarmam ve yeni nesneler.
Bunu daha zarif yapmanın bir yolu var mı? İdeal olarak sadece güncellenmiş filmi içeriğe geçirmek ve Equals()
yönteme göre güncellemek için doğru filmi seçmesini, tüm alanlarını ve her karmaşık nesne için güncellemesini istiyorum: mevcut Equals()
yöntemi kendi yöntemine göre tekrar kullanın ve henüz mevcut değil.
.Update()
Ekli tüm nesneleri alma kombinasyonunda kullanabileceğim her karmaşık nesne üzerinde yöntemler sağlayarak ayırma / ekleme işlemini atlayabilirim, ancak yine de güncelleştirmek için mevcut her nesneyi almamı gerektirir.
id
ve harici API'den gelen filmler alan kullanılarak yerel olanlarla eşleştiriliyor tmdbid
. Filmler, türler, diller, anahtar kelimeler vb. İle ilgili olduğu için tek bir çağrıda güncellenmesi gereken tüm varlıkları alamıyorum. Bunların her birinin bir PK'si var ve veritabanında zaten var olabilir.