2009-05-28 6 views
14

Sto utilizzando una transazione per inserire più righe in più tabelle. Per queste righe vorrei aggiungere queste righe in ordine. Dopo aver chiamato SaveChanges, tutte le righe vengono inserite fuori ordine.Struttura entità ordine di inserzione riga

Quando non si utilizza una transazione e si salvano le modifiche dopo ogni inserimento si mantiene l'ordine, ma ho davvero bisogno di una transazione per tutte le voci.

+1

Perché l'ordine di inserimento in un database SQL è importante? –

+5

L'ordine di inserimento non ha importanza, tuttavia l'ordine delle chiavi primarie lo fa. – Wouter

risposta

9

Gli inserimenti/aggiornamenti ed eliminazioni di ordini effettuati in Entity Framework dipendono da molte cose in Entity Framework.

Ad esempio se si inserisce un nuovo prodotto in una nuova categoria, è necessario aggiungere la categoria prima del prodotto.

Ciò significa che se si dispone di un ampio insieme di modifiche, esistono dei vincoli di ordine locale che dobbiamo soddisfare per primi, e in effetti questo è ciò che facciamo.

L'ordine in cui si fanno le cose nel contesto può essere in conflitto con queste regole. Per esempio, se si esegue questa operazione:

ctx.AddToProducts(
    new Product{ 
     Name = "Bovril", 
     Category = new Category {Name = "Food"} 
    } 
); 

l'effetto è che si aggiunge il prodotto (al contesto) e poi quando camminiamo il grafico aggiungiamo Categoria troppo.

cioè l'ordine di inserimento nel contesto è:

Product 
Category 

ma a causa di vincoli di integrità referenziale dobbiamo ri-ordine come questo prima di tentare di inserire nel database:

Category 
Product 

Quindi questo tipo di riordino locale è un tipo di non negoziabile.

Tuttavia, se non ci sono dipendenze locali come questa, in teoria è possibile conservare l'ordine. Purtroppo al momento non tracciamo 'quando' qualcosa è stato aggiunto al contesto, e per ragioni di efficienza non monitoriamo le entità per preservare strutture come le liste. Di conseguenza non possiamo attualmente conservare l'ordine degli inserti non correlati.

Comunque stavamo discutendo di questo solo di recente, quindi sono desideroso di vedere quanto sia vitale per te?

Spero che questo aiuti

squadra Alex

Program Manager Entity Framework

+0

Grazie per la spiegazione. Mi verrebbe sicuramente risparmiato un po 'di tempo se fosse supportato, ma suppongo che potrei anche generare le mie chiavi primarie personalizzate per ottenere lo stesso effetto. – Wouter

+0

Ci sono alcune altre risposte alla domanda qui sotto. Ho risolto il problema ordinando timestamp o cosa no invece della chiave primaria. – Wouter

+3

Qualche aggiornamento su questo? Ho una situtazione in cui le mie tabelle hanno un vincolo su una chiave alternativa, quindi non esiste una relazione visibile sul modello. (A.K. è userName, invece di userId). Quindi, come posso modificare l'ordine degli inserimenti, al momento, quando aggiungo l'utente e poi aggiungo l'utente a un gruppo, i savechanges falliscono. – hazimdikenli

1

Sono in procinto di attraversare questo ponte. Sto sostituendo NHibernate con EF e il problema che sto attraversando è come gli elenchi vengono inseriti nel DB. Se aggiungo elementi a un elenco come questo (in codice pseduo):

list.Add (testObject); list.Add (testObject1);

Attualmente non è possibile ottenere lo stesso ordine quando si esegue "SalvaChanges". È un peccato perché il mio oggetto lista (cioè la lista collegata) conosce l'ordine in cui è stato creato. Gli oggetti che sono incatenati usando i riferimenti DEVONO essere salvati nel DB nello stesso ordine. Non sei sicuro del motivo per cui hai detto che stai "discutendo" di questo. =)

+0

non sono sicuro che se noterà quando risponderai qui, probabilmente dovresti anche commentare la sua risposta – Wouter