Я получаю данные фильма из внешнего 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
объекту, это означает, что мне придется отделить фильм, языки, жанры и ключевые слова, найти каждый из них в базе данных, перенести их идентификаторы и вставить новые объекты.
Есть ли способ сделать это более элегантно? В идеале я просто хочу передать обновленный фильм в контекст, и он должен выбрать правильный фильм для обновления на основе Equals()
метода, обновить все его поля и для каждого сложного объекта: снова использовать существующую запись на основе своего собственного Equals()
метода и вставить, если это еще не существует.
Я могу пропустить отсоединение / присоединение, предоставляя .Update()
методы для каждого сложного объекта, которые я могу использовать в сочетании с извлечением всех прикрепленных объектов, но для этого все равно потребуется извлекать каждый существующий объект, чтобы затем обновить его.
id
и фильмы из внешнего API сопоставляются с локальными с помощью поля tmdbid
. Я не могу получить все объекты, которые необходимо обновить за один вызов, потому что они касаются фильмов, жанров, языков, ключевых слов и т. Д. Каждый из них имеет PK и может уже существовать в базе данных.