.NET EntityFramework: "Une erreur s'est produite lors du démarrage d'une transaction sur la connexion du fournisseur. Voir l'exception interne pour plus de détails"

.net entity-framework

Question

Utilisation de Entity Framework dans .NET Je souhaite parcourir une liste d'éléments renvoyés de la base de données et effectuer des mises à jour.

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

Selon: http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/8a337036-d288-48d4-80d4-89e5a51eddd9?ppud=4 S Hargroves suggère de convertir en IListe la solution.

Je n'ai pas essayé, je suis sûr que cela fonctionnera, mais même si cela fonctionne, je veux savoir pourquoi je ne peux pas mettre à jour l'élément pendant la boucle? Cela se produit sur mon environnement de développement local sans qu'aucun autre utilisateur ne frappe la base de données.

Merci ...

Réponse populaire

Lorsque vous mettez à jour la base de données à l'aide de SaveChanges sur une requête, la requête est invalidée. L'ensemble de résultats peut avoir été modifié par la mise à jour que vous avez effectuée.

En utilisant ToList , vous déclenchez l'exécution de la requête et vous mettez en mémoire tous les résultats de la base de données. Votre liste en mémoire est maintenant concrète et ne veut plus être une requête.

Comme les requêtes d'objets utilisent IEnumerable , il n'est pas correct de faire quelque chose qui modifie la liste dans un foreach.

Je pense aussi que ce code échouerait pour les mêmes raisons fondamentales:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow