2013-11-20 17 views
6

Ricevo un errore durante l'esecuzione di un'attività che dovrebbe essere abbastanza semplice.Eccezione DBConcurrency con Entity Framework 6

Sto utilizzando il codice Entity Framework 6 prima.

Sto aggiungendo una nuova entità al mio contesto, rimuovendola e quindi eseguendo un salvataggio. Questo produce un'eccezione DBConcurrency (io sono l'unico utente).

Per fare questo ho eseguire le seguenti operazioni:

zurich.TagProjectGroupItems.Add (tagProjectGroupItem); zurich.TagProjectGroupItems.RemoveRange (articoli);

(dell'oggetto originariamente aggiunto faceva parte della collezione)

int counter = zurich.SaveChanges();

Ciò genera la seguente eccezione:

Un'eccezione di tipo 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' si è verificato in EntityFramework.dll ma non è stata gestita nel codice utente Ulteriori informazioni: Aggiornamento Store, inserire o eliminare l'istruzione interessata da un numero imprevisto di righe (0). Le entità potrebbero essere state modificate o eliminate da quando le entità sono state caricate. Aggiorna le voci di ObjectStateManager.

L'objectcontext mi dice che ho 0 nuove voci, 0 aggiornate e 1 da eliminare. Immagino che stia cercando di rimuovere l'entità dal database e restituendo 0 risultati perché l'entità non è stata scritta.

Sto facendo qualcosa di assolutamente sbagliato ?! Non ho mai usato prima il codice in precedenza e ho usato solo il modello prima in EF4. Sono perplesso.

Molte grazie,

Rob

+0

Stai dicendo che l'oggetto items che stai rimuovendo dalla collezione contiene il tagProjectGroupItem che hai * solo * aggiunto al contesto? –

+0

Esatto, sì Ciaran. L'interfaccia utente consente all'utente di aggiungere un'entità e anche di rimuoverla/eliminarla. Potrei rimuovere ma ottengo lo stesso risultato ovviamente. –

+0

Ma perché aggiungere l'elemento al contesto se si desidera rimuovere immediatamente l'elemento? L'aggiunta e la rimozione delle entità non sarebbero eventi/gestori separati? –

risposta

0

DbUpdateConcurrencyException del sono chiamati "quando ci si aspettava che SaveChanges per un'entità si tradurrebbe in un aggiornamento del database, ma in realtà nessuna riga nel database sono stati colpiti". Source

Penso EntityFramework esegue questo controllo per evitare problemi di concorrenza in scenari multiutente.

È possibile inserire un altro zurich.SaveChanges(); subito dopo aver aggiunto l'elemento e quindi rimuovere correttamente gli articoli, ma come si cita, non è l'ideale.

Forse invece si dovrebbe verificare l'insieme di elementi - e se il tagProjectGroupItem è contenuto all'interno delle voci, quindi non chiamare zurich.TagProjectGroupItems.Add(tagProjectGroupItem);, e invece rimuovere il tagProjectGroupItem dalla raccolta prima chiamare il funzionamento del database.

+1

Sono riuscito a aggirarlo controllando lo stato dell'entità quando lo si rimuove dal contesto. Nel metodo remove se è entitystate.added, quindi lo ho impostato su detached. Pertanto, quando viene avviato il salvataggio, l'entità viene scollegata e non causa il problema. Questo sembra risolvere il problema ma sembra un po 'hacky. –

Problemi correlati