Domanda

Ho una tabella che ha un indice univoco su una tabella con una colonna ordinale. Quindi, ad esempio, la tabella avrà le seguenti colonne:

TableId, ID1, ID2, ordinale

L'indice univoco è attraverso le colonne ID1, ID2, ordinale.

Il problema che ho è che durante l'eliminazione di un record dal database, quindi resequence gli ordinali in modo che siano di nuovo sequenziali. La mia funzione elimina sembrerà così:

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }

Il problema è che quando chiamo contesto.savechanges () rompe l'indice univoco in quanto sembra eseguire le dichiarazioni in un ordine diverso da quello che sono stati approvati. Ad esempio, succede quanto segue:

  1. Resequence le ordinali
  2. Elimina il record

Invece di:

  1. Elimina il record
  2. Resequence le ordinali

È questo il comportamento corretto di EF? E se lo è, esiste un modo per prevalere su questo comportamento per forzare l'ordine di esecuzione?

Se non l'ho spiegato correttamente, per favore fatemi sapere ...

È stato utile?

Soluzione

L'ordine dei comandi è completamente sotto il controllo di EF. L'unico modo in cui è possibile influire sull'ordine è utilizzare SaveChanges separati per ogni operazione:

public void Delete(int id)
{
    var tableObject = Context.TableObject.Find(id);
    Context.TableObject.Remove(tableObject);
    Context.SaveChanges();
    ResequenceOrdinalsAfterDelete(tableObject);
    Context.SaveChanges();
}

Dovresti anche eseguire quel codice nella transazione creata manualmente per garantire l'atomicità (=> TransactionScope).

Ma la soluzione migliore sarebbe probabilmente utilizzare la procedura memorizzata perché la resequenziazione deve estrarre tutti i record interessati dal database all'applicazione, modificare il loro ordinale e salvarli nel database uno per uno.

Btw. facendo questo con odori di database. Qual è il problema con un divario nella tua sequenza "ordinale"?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top