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.
ide 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.