Ogni volta che ho visto questo errore, significa che qualcosa è cambiato nel database tra il momento in cui ho caricato il record/oggetto/qualsiasi cosa e quando stavo cercando di salvarlo. Senza dubbio, è stato perché la mia unità di lavoro era troppo grande.
Non conosco la natura esatta della vostra applicazione, ma presumo che si stia creando un contesto dati, caricando un record o un elenco di record, eseguendo alcune operazioni su di esso, masticando un po 'di tempo e cicli del processore, e poi alla fine cercando di salvare i dati modificati nel database. Forse anche caricando un'istanza di un record/oggetto e memorizzandola in una variabile di classe per un po ', e poi alla fine di un caricamento o thread di una pagina o qualsiasi altra cosa provando a salvare di nuovo tutto ciò che è cambiato. Il problema è che poiché LINQ ne ha memorizzato una copia, quella è la copia che vuole aggiornare. Se i dati sottostanti cambiano nel frattempo, si arrabbia.
Chiedetevi questo, e se metteste una transazione di blocco sui vostri dati per l'intera vita dei vostri oggetti. Qualsiasi cosa tu abbia caricato, qualcuno potrebbe modificare, a nessun altro sarebbe permesso di toccarlo durante quel periodo. Fondamentalmente questo è l'assunto qui. Certo, LINQ è un po 'più ottimista a riguardo, non ha senso bloccare la riga o il tavolo se non si stanno aggiornando i dati, ma si pensa a questi problemi. Chiediti cosa potrebbe rompersi o rallentare in modo significativo se si inserissero serrature transazionali rigorose sugli oggetti e questo probabilmente ti indirizzerà al codice incriminato.
La mia soluzione a questo è di mantenere la mia unità di lavoro il più piccola possibile. Non caricare l'oggetto e utilizzarlo come copia di lavoro e memorizzarlo nel database, tutto in un unico contesto. Invece, carica l'oggetto ed estrai le informazioni che ti servono in un solo passaggio, quindi scopri le modifiche che devi applicare, quindi carica/aggiorna/salva l'oggetto. Certo, provoca più round trip nel database, ma ti dà una migliore garanzia che stai lavorando con l'ultima copia di dati. Sarà ancora "last in, wins", il che significa che se qualcuno ha fatto un aggiornamento mentre lavoravi con i dati potrebbe essere perso, ma questo è sempre un rischio a meno che non blocchi il record con una transazione. Tuttavia, ti offre la flessibilità che se qualcun altro sta modificando campi non correlati nella stessa riga, entrambi possono operare insieme su questi dati.
fonte
2012-01-13 14:24:42
mi piacerebbe verificare che i tipi di dati ei vincoli nulli corrispondono esattamente tra il dbml e il database. – codingbadger
@Barry si lo fanno tutti, ho aggiunto di nuovo ogni tabella –