Erreur de transaction lors de la mise à jour des modèles Entity Framework
Lors d'une tentative de connexion d'entités de deux bases de données distinctes, les développeurs peuvent rencontrer l'erreur : "Nouveau la transaction n'est pas autorisée car d'autres threads sont en cours d'exécution dans la session." Ce message déroutant peut survenir lors de la tentative de code intégrant plusieurs boucles et contextes Entity Framework.
Le problème sous-jacent vient du fait qu'Entity Framework (EF) maintient une session pour chaque contexte créé. Lorsque plusieurs threads accèdent simultanément au même contexte, cela peut entraîner des conflits de transactions. Pour résoudre ce problème, il est crucial d'éviter de modifier le même contexte dans différents threads.
Dans l'exemple fourni, la cause première de l'erreur était l'utilisation de boucles foreach imbriquées sur les requêtes EF. Cette approche signifiait qu'un nouveau contexte EF était créé pour chaque itération de la boucle externe, ce qui entraînait que de nombreuses sessions actives accédaient simultanément au même contexte.
La solution optimale consiste à récupérer les données d'EF à l'aide d'une requête et à les stocker. dans une collection intermédiaire (par exemple, IList
Voici un exemple de code modifié pour illustrer :
IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a; foreach (RivWorks.Model.NegotiationAutos.Client client in clientList) { var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a; // ... }
En isolant le Récupération des données du contexte, nous éliminons le risque de chevauchement des transactions et veillons à ce qu'aucune erreur ne soit rencontrée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!