Acione a chave primária em vez da identidade

5

Eu tenho o seguinte problema -

Sobre ~ 60 tabelas em SQL que algumas têm chave estrangeira entre si, chave primária como identidade teve que mudar para outra coisa com lógica. Ele foi substituído por disparadores que verificam qual é o próximo número e alteram o campo da chave primária (por sequência)

Agora, isso causa vários problemas no EF ao tentar inserir uma nova identidade:

  1. Para atualizar as chaves estrangeiras, devo recuperar a entidade do banco de dados porque a chave primária não está atualizando.

  2. Quando eu adiciono mais de uma entidade, a EF lança uma exceção que a chave primária não é exclusiva. (Recebe o valor padrão no meu caso 0 para int)

A solução para 1 é boa somente se eu tiver outros campos exclusivos que eu possa recuperar a entidade do banco de dados.

A melhor solução para 2 que eu poderia usar é usar a entidade Detach após cada inserção.

Ambos não são ideais, para dizer o mínimo.

Ficaria feliz em saber se existe outra solução / outra abordagem em vez de disparadores.

Neste ponto, não posso alterar a estrutura das tabelas no banco de dados, apenas manipulações no campo de chave primária.

Suplemento:

Os IDs gerados automaticamente foram abandonados para eliminar duplicatas neste campo, pois essas tabelas serão executadas em vários bancos de dados que são mesclados de tempos em tempos.

    
por Ziv Weissman 20.12.2016 / 15:49
fonte

1 resposta

2

Eu não acho que seja uma solução perfeita, especialmente para tabelas que vão crescer de maneira imprevisível, mas muitos bancos de dados (SQL Server) permitem campos que aplicam automaticamente um valor incremental (Identity), portanto, sejam semeados em um número diferente de um.

O banco de dados A pode começar com 1 e o banco de dados B pode começar com 1 milhão. Você tem a exclusividade garantida entre os dois bancos de dados para suas tabelas, mas obviamente há um limite.

Há também rotinas no banco de dados para redefinir os valores de identificação existentes. Isso provavelmente exigiria que você ressincronizasse os dados enviados de um para o outro.

Ao fazer isso, o Entity Framework não deve ser afetado. Você tem alguma aparência de garantir exclusividade até um ponto que exigirá alguma intervenção do tipo DBA.

    
por 21.12.2016 / 13:17
fonte