Ordem de execução de declaração de DbContext SaveChanges
-
27-10-2019 - |
Pergunta
Eu tenho uma tabela que possui um índice exclusivo em uma tabela com uma coluna Ordinal. Portanto, por exemplo, a tabela terá as seguintes colunas:
TableId, ID1, ID2, Ordinal
O índice exclusivo está nas colunas ID1, ID2, Ordinal.
O problema que tenho é que, ao excluir um registro do banco de dados, eu então re-sequenciamento os ordinais para que sejam sequenciais novamente. Minha função de exclusão será semelhante a esta:
public void Delete(int id)
{
var tableObject = Context.TableObject.Find(id);
Context.TableObject.Remove(tableObject);
ResequenceOrdinalsAfterDelete(tableObject);
}
O problema é que, quando chamo Context.SaveChanges (), ele quebra o índice exclusivo, pois parece executar as instruções em uma ordem diferente daquela em que foram passadas. Por exemplo, acontece o seguinte:
- Resequence os ordinais
- Exclua o registro
Em vez de:
- Exclua o registro
- Resequência dos ordinais
Este é o comportamento correto do EF? E se for, existe uma maneira de substituir esse comportamento para forçar a ordem de execução?
Se eu não tiver explicado isso corretamente, por favor me avise ...
Solução
A ordem dos comandos está totalmente sob controle da EF.A única maneira de afetar o pedido é usando SaveChanges separados para cada operação:
public void Delete(int id)
{
var tableObject = Context.TableObject.Find(id);
Context.TableObject.Remove(tableObject);
Context.SaveChanges();
ResequenceOrdinalsAfterDelete(tableObject);
Context.SaveChanges();
}
Você também deve executar esse código na transação criada manualmente para garantir a atomicidade (=> TransactionScope
).
Mas a melhor solução provavelmente seria usar o procedimento armazenado, porque seu novo sequenciamento deve puxar todos os registros afetados do banco de dados para o seu aplicativo, alterar seus ordinais e salvá-los de volta no banco de dados um por um.
Btw.fazendo isso com cheiros de banco de dados.Qual é o problema de ter uma lacuna em sua sequência "ordinal"?