.NET EntityFramework: "Si è verificato un errore durante l'avvio di una transazione sulla connessione del provider. Vedere l'eccezione interna per i dettagli"

.net entity-framework

Domanda

Utilizzando Entity Framework in .NET, voglio scorrere un elenco di elementi restituiti dal database ed effettuare aggiornamenti.

var qry = (from c in DBEntities.Customer select c);
foreach (Object item in qry)
{
  item.FirstName = .... 
  ... etc, other code here
  DBEntities.SaveChanges();
}

Secondo: http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/8a337036-d288-48d4-80d4-89e5a51eddd9?ppud=4 S Hargroves suggerisce di convertirsi in un IList e questa è la soluzione.

Non l'ho provato, sono sicuro che funzionerà, ma anche se funziona, voglio sapere perché non riesco ad aggiornare l'articolo durante il ciclo? Ciò si verifica sul mio ambiente di sviluppo locale senza che nessun altro utente colpisca il database.

Grazie ...

Risposta popolare

Quando si aggiorna il database utilizzando SaveChanges su una query, la query viene invalidata. Il set di risultati potrebbe essere stato modificato dall'aggiornamento eseguito.

Usando ToList , si ToList l'esecuzione della query e si ToList in memoria tutti i risultati del database. La tua lista in memoria è ora concreta e non riguarda più la query.

Poiché Object Queries utilizza IEnumerable , non è corretto eseguire qualcosa che modifichi l'elenco in un foreach.

Credo anche che questo codice fallirebbe per le stesse ragioni di base:

List<int> numbers = new List<int>() { 1,2,3,4,5,6};
foreach(var num in numbers)
  numbers.Remove(num); //Invalidates the Enumerator being used in the foreach


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché