2013-05-04 19 views
5

L'ho fatto molte volte e ha funzionato.Aggiornamento di un record utilizzando Linq-to-SQL

Ogni esempio che ho trovato è esattamente quello che ho ..

faccio la mia domanda ...

var result = from u in tdc.tblUsers 
      where u.UserID == userID 
      select u; 

e poi cambiare i valori che voglio:

foreach (tblUsers u in result) 
{ 
    //change values (and no im not changing the primary key or foreign keys) 
} 

poi inviare le modifiche

tdc.SubmitChanges(); 

che ho provato anche in questo modo prima e ottenuto lo stesso errore

tblUsers result = (from u in tdc.tblUsers 
        where u.UserID == userID 
        select u).Single(); 
result.Address = address; 
result.Phone = phone; 
tdc.SubmitChanges(); 

Sarà sempre e solo recuperare 1 record con questa query dal UserID è la chiave primaria.

Quando colpisce invia modifiche, genera eccezione che la riga non è stata trovata o è stata modificata. Sono l'unica persona che usa questo, quindi non ci sono altri conflitti con l'accesso al db o al blocco. Perché dovrebbe lanciare il ChangeConflictException? Ho fatto il passo con il debugger e i dati persistono lungo tutto il processo, comprese le modifiche che sto cercando di fare.

+0

Si sta utilizzando Entity Framework (e in tal caso, quale versione)? – gunr2171

+0

Inoltre, TUTTE le tue tabelle hanno chiavi primarie. Questo include quello che stai modificando e qualsiasi tabella di ramificazione da chiavi esterne. – gunr2171

+0

.NET Framework 4 e sì tutte le tabelle dispongono di chiavi primarie e di chiavi esterne appropriate. Questa query sta andando solo dopo 1 tabella, e quella tabella non ha alcuna chiave esterna in essa. È uno dei miei tavoli base. –

risposta

6

Si sta verificando questo errore, probabilmente perché uno dei campi ha qualcosa di diverso nella finestra di progettazione di Linq To SQL e nel database attuale.

Oppure si può dare un'occhiata a questo article

Good Luck!

+0

Ho eliminato il dbml, l'origine dati aggiornata e ho riavviato tutte le mie tabelle. Il programma ripetuto e l'eccezione non si sono verificati. Grazie. Ho dimenticato una modifica apportata al database in precedenza lol. +1 per te –

+0

Stavo andando anche io. Mi ha detto che dovevo aspettare un paio di minuti lol –

2

Forse lavori con contesti diversi? Prova a incapsularlo con l'uso.

come questo

using (myContext ctx = new myContext()) 
{ 
    var user = ctx.users.first(); 
    user.name="blah"; 
    ctx.SubmitChanges(); 
} 
0

Molto spesso, se si guarda al SQL effettivo che LINQ to SQL genera, vedrai che è l'essere davvero eccesso di zelo con corrispondenti alla riga database che si inizialmente recuperato. Immagina di avere una tabella con ID colonne (PK), A, B, C. Si potrebbe pensare che se si aggiorni la colonna C per una riga, dovrebbe essere sufficiente aggiornare la riga con una chiave primaria corrispondente. Ma spesso accade che Linq-to-SQL stia cercando di eguagliare anche le colonne A e B. Normalmente, va bene. A meno che non si abbiano scritture simultanee, da multi-threading o multi-processi, e qualcos'altro modifica la colonna A o B per il record che si sta tentando di aggiornare. Quindi ottieni questi System.Data.Linq.ChangeConflictException: Row non trovata o modificata. errori quando chiami SubmitChanges() sul tuo contesto dati.

Problemi correlati