2009-12-14 11 views
7

sto aggiornando un oggetto di tipo X e dei suoi figli Y utilizzando LINQ to SQL e poi presentando modifiche e questo erroreLINQ to SQL "1 su 2 Aggiornamenti fallito" on "SubmitChanges()"

Esempio di codice

On SubmitChanges() Ricevo un'eccezione "1 di 2 aggiornamenti non riusciti", nessun'altra informazione sul motivo per cui ciò è accaduto. Qualche idea?

Anche il tipo di eccezione è ChangeConflictException

risposta

10

Era talmente qual è stata la causa del problema - Un trigger

ho fatto un profiler di sql e ho visto che

Quando la proprietà DeletedOn di ObjY ottenuto aggiornato un trigger aggiornato proprietà di ObjX (valore indicato nella tabella) denominata CountOfX

che ha provocato un errore in quanto l'SQL creato da LINQ su SQL aveva il vecchio valore CountOfX.

Quindi il conflitto.

Se mai questo errore - SQL Profiler è il posto migliore per iniziare la vostra ricerca

INOLTRE NON CONNESSO ALLA QUESTIONE sto testando LINQ to SQL e ADO.net quadro, stranamente questo errore è accaduto in LINQ a SQL ma non nel framework ADO.net. Ma mi piace LINQ to SQL per il suo caricamento lento.In attesa dell'uscita di EF dalla beta

+0

Un altro motivo per evitare i trigger .... – RickNZ

+1

Il motivo dell'errore non si verifica nel framework di ADO.net in quanto utilizza solo il valore EntityKey per creare gli aggiornamenti ovvero la condizione WHERE controlla solo il valore dell'entità, non per ogni valore di colonna come LINQ2SQL – soldieraman

+0

Quindi è comunque necessario evitare questo errore se non evitare i trigger completamente? – liang

2

Non sono sicuro di quale sia la causa dell'errore può essere esattamente, ma sembra che ci siano un certo numero di problemi con l'esempio che ci hai fornito.

  • Utilizzando ToList() prima che il metodo Dove() causerebbe vostro contesto di leggere l'intera tabella dal DB nella memoria, convertirlo in un array; e poi nella stessa linea, immediatamente, si chiama Where, che scarterà le righe che hai caricato, ma non ne hanno bisogno. Perché non solo:

    _context.X.Where (...

  • Il Dove metodo restituirà più elementi, ma la seconda riga dell'esempio non sembra essere iterazione attraverso ogni elemento singolarmente E. sembra impostare la proprietà DeletedOn per la raccolta stessa, ma la raccolta non avrebbe tale proprietà. Dovrebbe fallire proprio lì.

  • Si sta utilizzando DateTime.Ora due volte nel codice. Non è un problema, tranne che questo produrrà valori di date sempre leggermente differenti ogni volta che viene chiamato. Dovresti chiamare DateTime.Ora una volta e assegnare il risultato a una variabile in modo che tutto ciò che usi valori dentali.

  • Nel punto in cui si ha "Y objY = objYs [0]" fallirà se non ci sono elementi nella collezione Y per una data X. Otterrai un indice fuori limite sull'array .

Quindi, dato questo esempio, non sono sicuro se qualcuno possa speculare sul perché il codice modellato dopo questo esempio potrebbe rompersi.

+0

Primo punto punto concordato Secondo punto elenco accettato. L'esempio è stato scritto in modo errato. L'ho aggiornato da allora, ma il codice è compilato in termini reali. Terzo punto bullet lo scopo di questo è di verificare se il salvataggio sarà in cascata 4 Sì, ci sono articoli nella collezione L'eccezione sale a SubmitChanges() Lo so, tranne che l'errore stesso non rivela molto. – soldieraman

+0

Ho pensato che funzionasse correttamente nel tuo codice reale (altrimenti non avresti ricevuto l'invio dove hai segnalato l'erro). l'esempio non ci ha dato abbastanza informazioni per aiutarci davvero perché c'erano altri problemi nell'esempio. Sono contento che tu abbia risolto il problema :) :) –

+0

Ho avuto lo stesso errore durante il tentativo di eliminazione. Ho inviato un 'List ' nel metodo 'DeleteAllOnSubmit()', ha funzionato benissimo fin dall'inizio, ma dopo un mese ho ricevuto questo errore. Ha funzionato quando ho cambiato da 'Lista ' a 'IQueryable '. – Martin

1

Nel diagramma di contesto dati LINQ2SQL selezionare l'Entità e il campo in cui è memorizzato il conteggio. (Una cifra denormalizzata)

Ora impostare UpdateCheck = Never.

0

Ho avuto questo tipo di problema. Stavo eseguendo il debug delle righe singole alla volta. Si è scoperto che un altro processo stava modificando questo record.

Il mio processo di debug manuale stava rallentando la normale velocità della funzione. Quando l'ho eseguito fino a una riga dopo il metodo SubmitChanges, è riuscito.

Il mio scenario sarebbe meno comune, ma la natura di questo errore si riferisce al record che viene sostituito da un'altra funzione/processo. Nel mio caso è stato un altro processo.

Problemi correlati