Я отримую дані про фільми із зовнішнього API. На першому етапі я скреблю кожен фільм і вставляю його у власну базу даних. На другому етапі я періодично оновлюватиму свою базу даних, використовуючи API "Зміни" API, який я можу запитати, щоб побачити, які фільми змінили свою інформацію.
Мій рівень ORM - це Entity-Framework. Клас фільму виглядає приблизно так:
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()
.
Це спричиняє проблеми, оскільки коли я зараз намагаюся оновити базу даних оновленим фільмом, вона вставить її замість оновлення існуючого фільму.
У мене виникло це питання раніше з мовами, і моє рішення полягало в пошуку приєднаних мовних об’єктів, від'єднанні їх від контексту, переміщенні їх ПК до оновленого об'єкта та приєднанні його до контексту. Коли SaveChanges()
він зараз виконується, він по суті замінить його.
Це досить смердючий підхід, оскільки якщо я продовжую цей підхід до свого Movie
об'єкта, це означає, що мені доведеться відірвати фільм, мови, жанри та ключові слова, шукати кожного в базі даних, переносити їхні ідентифікатори та вставляти нові об’єкти.
Чи є спосіб зробити це більш елегантно? В ідеалі я просто хочу передати оновлений фільм до контексту, який повинен вибрати правильний фільм для оновлення на основі Equals()
методу, оновити всі його поля та для кожного складного об'єкта: знову використати існуючий запис за власним Equals()
методом та вставити, якщо вона ще не існує.
Я можу пропустити від'єднання / приєднання, надаючи .Update()
методи для кожного складного об'єкта, який я можу використовувати в поєднанні з отриманням усіх приєднаних об'єктів, але це все одно вимагатиме від мене кожного кожного існуючого об'єкта, а потім оновити його.
id
а фільми із зовнішнього API узгоджуються з локальними, використовуючи поле tmdbid
. Я не можу отримати всі об'єкти, які потрібно оновити за один дзвінок, оскільки мова йде про фільми, жанри, мови, ключові слова тощо. Кожен з них має ПК та може вже існувати в базі даних.