Dbcontext savechanges ordine di esecuzione dell'istruzione
-
27-10-2019 - |
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:
- Resequence le ordinali
- Elimina il record
Invece di:
- Elimina il record
- 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 ...
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"?