Quale logica determina l'ordine di inserimento di Entity Framework 6

c# entity-framework entity-framework-6 entity-framework-core

Domanda

Quindi, ho un DBContext e sto facendo le seguenti operazioni:

dbContext.SomeTables1.Add(object1)
dbContext.SomeTables2.AddRange(objectArray2)
dbContext.SomeTables3.AddRange(objectArray3)
dbContext.SaveChanges();

L'EF non inserisce i record db in questo ordine, li inserisce in un ordine casuale. Per inserirli nello stesso ordine, devo fare un dbContext.SaveChanges() dopo ogni aggiunta. Questa non è una soluzione efficiente e nel mio caso sono necessari 10 secondi per eseguire tutti i miei inserimenti, mentre l'ordine casuale con un salvataggio dura circa 3 secondi.

NB Ho bisogno del giusto ordine per risolvere un problema di deadlock.

Le mie domande sono:

  • Questo problema è stato risolto in EF7?
  • Posso profilare EF e determinare l'ordine casuale, tuttavia, esiste una garanzia che sia coerente con lo stesso ordine casuale o cambi tra le richieste? (Posso adottare il mio altro codice se la risposta a questa domanda è positiva).
  • C'è un modo migliore per mantenere l'ordine di dbContext.SaveChanges() su ogni aggiunta?

Risposta accettata

  • Non è possibile specificare un ordine di salvataggio in EF6 o EF7.
  • Il problema non è risolto in EF7 poiché questo non è un problema.
  • L'ordine sarà lo stesso se il predecessore è lo stesso (cosa che probabilmente accadrà raramente)

Quando chiami SaveChanges, tutte le entità vengono ordinate da un ordine interno nel metodo "ProducingDynamicCommands" e poi ordinate di nuovo con il metodo "TryTopologicalSort" che esegue il loop per aggiungere il comando senza alcun predecessore a sinistra (se aggiungi A e B e A dipendono da B, quindi B sarà inserito prima di A)

Sei lasciato per inserire per aggiunta di gruppo.

Dal momento che sono necessari 3 secondi per eseguire l'inserto, assumerò che tu abbia migliaia di entità e che l'inserimento bulk di massa possa migliorare le tue prestazioni per ridurre i 10 secondi a meno, e quindi forse i primi 3 secondi!

Qui ci sono 2 librerie che posso consigliare:

Disclaimer : sono il proprietario del progetto Entity Framework Extensions.


Risposta popolare

Potresti ordinarlo prima di usare la funzione Aggiungi e poi usare il salvataggio? Sarebbe d'aiuto / l'hai provato?



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché