Recupero datos de películas de una API externa. En una primera fase, rasparé cada película y la insertaré en mi propia base de datos. En una segunda fase, actualizaré periódicamente mi base de datos utilizando la API "Cambios" de la API, que puedo consultar para ver qué películas han cambiado su información.
Mi capa ORM es Entity-Framework. La clase de película se ve así:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
El problema surge cuando tengo una película que necesita ser actualizada: mi base de datos pensará en el objeto que se está rastreando y en el nuevo que recibo de la llamada API de actualización como objetos diferentes, sin tener en cuenta .Equals()
.
Esto causa un problema porque cuando ahora trato de actualizar la base de datos con la película actualizada, la insertará en lugar de actualizar la película existente.
Tuve este problema antes con los idiomas y mi solución fue buscar los objetos de lenguaje adjuntos, separarlos del contexto, mover su PK al objeto actualizado y adjuntarlo al contexto. Cuando SaveChanges()
ahora se ejecuta, esencialmente lo reemplazará.
Este es un enfoque bastante maloliente porque si continúo este enfoque hacia mi Movie
objeto, significa que tendré que separar la película, los idiomas, los géneros y las palabras clave, buscar cada uno en la base de datos, transferir sus ID e insertar el nuevos objetos
¿Hay alguna manera de hacer esto con más elegancia? Idealmente, solo quiero pasar la película actualizada al contexto y hacer que seleccione la película correcta para actualizar según el Equals()
método, actualice todos sus campos y para cada objeto complejo: use el registro existente nuevamente según su propio Equals()
método e inserte si aún no existe
Puedo omitir la separación / fijación proporcionando .Update()
métodos en cada objeto complejo que puedo usar en combinación para recuperar todos los objetos adjuntos, pero esto aún requerirá que recupere cada objeto existente para luego actualizarlo.
id
y las películas de la API externa coinciden con las locales que usan el campo tmdbid
. No puedo recuperar todas las entidades que deben actualizarse en una sola llamada porque se trata de películas, géneros, idiomas, palabras clave, etc. Cada una de estas tiene un PK y puede que ya exista en la base de datos.