2012-04-10 11 views
127

Qualche idea sul perché questo potrebbe essere interrotto?La nuova transazione non è consentita perché ci sono altri thread in esecuzione nella sessione LINQ all'entità

foreach (var p in pp) 
{ 
    ProjectFiles projectFile = (ProjectFiles)p; 
    projectFile.Status = Constants.ProjectFiles_ERROR; 
    projectFile.DateLastUpdated = DateTime.Now; 
    context.SaveChanges(); 
} 

Ho letto che la soluzione, il problema, è di recuperare i risultati in una volta prima del ciclo foreach.

Ma non l'ho fatto? "pp" è la raccolta di risultati nel mio caso

+10

'pp' è il risultato di una query di linq? Se è così, potrebbe essere necessario fare un 'ToList()' su di esso per disconnetterlo dal database prima di eseguire il ciclo. – SouthShoreAK

+0

Sì, lo è. Ok, ci proverò grazie Grazie –

+2

chiamata salva le modifiche al di fuori del ciclo – Mohsin

risposta

321

La variabile pp non è una raccolta di oggetti, è un enumeratore che può restituire oggetti. Mentre si utilizza l'enumeratore, la sorgente deve rimanere aperta.

Utilizzare il metodo ToList per realizzare l'enumeratore in una raccolta. Questo leggerà tutti gli elementi dall'enumeratore e chiuderà la connessione all'origine, in modo che tu possa usare la connessione per altre cose.

foreach (var p in pp.ToList()) 
+14

Dio vi benedica @Guffa !!! +1 –

+2

Grande !! Funziona anche con pp.ToArray() –

+2

Ricardo, funziona fintanto che non è IQueryable –

7

Quello che sta succedendo è che si sta utilizzando una connessione SQL per iterare su un insieme di entità db, quindi utilizzando un'altra connessione per salvare le modifiche. Questo accade perché le tue classi sono fondamentalmente "sposate" con un'istanza della tua connessione db e non possono essere modificate da un'altra.

Un modo per aggirare questo è chiamare .ToList() sulla raccolta prima di iterarlo.

E mentre ci sei, chiama lo context.SaveChages() solo una volta dopo che il ciclo è terminato per accelerare il codice.

Problemi correlati