9

Ho una tabella che ha un indice univoco su una tabella con una colonna Ordinale. Così, ad esempio, la tabella avrà le seguenti colonne:DbContext SaveChanges Ordine di esecuzione Esecuzione

TableID, ID1, ID2, ordinale

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

Il problema che ho è che quando si elimina un record dal database, quindi rianquisto gli ordinali in modo che siano di nuovo sequenziali. La mia funzione di eliminazione sarà simile a questa:

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

Il problema è che quando chiamo Context.SaveChanges() si rompe l'indice univoco come sembra l'esecuzione delle istruzioni in un ordine diverso da quello che sono state approvate. Ad esempio si verifica quanto segue:

  1. resequence ordinali
  2. eliminare il record

Anziché:

  1. Eliminare il record
  2. resequence ordinali

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

Se non mi sono spiegato correttamente questo, per favore fatemelo sapere ...

risposta

9

ordine dei comandi è completamente sotto il controllo di EF. L'unico modo come si può influenzare l'ordine usando SaveChanges separate per ogni operazione:

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

È inoltre necessario eseguire che il codice transazione creata manualmente per garantire l'atomicità (=>TransactionScope).

Tuttavia, la soluzione migliore sarebbe probabilmente l'utilizzo della stored procedure perché la risequenziazione deve estrarre tutti i record interessati dal database nell'applicazione, modificare il loro ordinale e salvarli nuovamente nel database uno alla volta.

Btw. facendo questo con odori di database. Qual è il problema di avere una lacuna nella tua sequenza "ordinale"?

+0

Ciao, grazie per la risposta! L'ho implementato in precedenza con un database e come hai detto puzza. Il codice è orribile ed è stato un problema, in più questo sarà accessibile solo da una sezione di amministrazione e cambierà piccole quantità. Il motivo principale per cui gli ordinali vengono risequenziati è che gli utenti di amministrazione possono impostare l'ordine su più tabelle e diventare pignoli o confusi quando vedono delle lacune ... Un po 'di bummer che EF non esegue nell'ordine che tu fornisci. – didiHamman