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:

  1. Resequence os ordinais
  2. Exclua o registro

Em vez de:

  1. Exclua o registro
  2. 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 ...

Foi útil?

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"?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top