Recupero dados do filme de uma API externa. Numa primeira fase, raspar cada filme e inseri-lo no meu próprio banco de dados. Em uma segunda fase, atualizarei periodicamente meu banco de dados usando a API "Alterações" da API, que posso consultar para ver quais filmes tiveram suas informações alteradas.
Minha camada ORM é Entity-Framework. A classe Movie é assim:
class Movie
{
public virtual ICollection<Language> SpokenLanguages { get; set; }
public virtual ICollection<Genre> Genres { get; set; }
public virtual ICollection<Keyword> Keywords { get; set; }
}
O problema surge quando eu tenho um filme que precisa ser atualizado: meu banco de dados pensa no objeto que está sendo rastreado e o novo que eu recebo da API de atualização chama como objetos diferentes, desconsiderando .Equals()
.
Isso causa um problema porque, quando agora tento atualizar o banco de dados com o filme atualizado, ele será inserido em vez de atualizar o filme existente.
Eu já tive esse problema com os idiomas e minha solução foi procurar os objetos de idioma anexados, desanexá-los do contexto, mover seu PK para o objeto atualizado e anexá-lo ao contexto. Quando SaveChanges()
agora é executado, o substituirá essencialmente.
Essa é uma abordagem bastante fedorenta, porque, se eu continuar com essa abordagem Movie
, significa que terei que desanexar o filme, os idiomas, os gêneros e as palavras-chave, procurar cada um no banco de dados, transferir seus IDs e inserir o código. novos objetos.
Existe uma maneira de fazer isso com mais elegância? O ideal é apenas passar o filme atualizado para o contexto e selecionar o filme correto a ser atualizado com base no Equals()
método, atualizar todos os seus campos e para cada objeto complexo: use o registro existente novamente com base em seu próprio Equals()
método e insira se ainda não existe.
Posso pular a desanexação / anexação fornecendo .Update()
métodos para cada objeto complexo que posso usar em combinação para recuperar todos os objetos anexados, mas isso ainda exigirá que eu recupere cada objeto existente para atualizá-lo.
id
e os filmes da API externa são compatíveis com os locais usando o campo tmdbid
. Não consigo recuperar todas as entidades que precisam ser atualizadas em uma chamada, porque trata-se de filmes, gêneros, idiomas, palavras-chave etc. Cada uma delas possui uma PK e pode já existir no banco de dados.