Maison > développement back-end > C++ > Pourquoi mon code Entity Framework renvoie-t-il « Une nouvelle transaction n'est pas autorisée car d'autres threads sont en cours d'exécution dans la session » ?

Pourquoi mon code Entity Framework renvoie-t-il « Une nouvelle transaction n'est pas autorisée car d'autres threads sont en cours d'exécution dans la session » ?

Linda Hamilton
Libérer: 2025-01-16 13:36:59
original
311 Les gens l'ont consulté

Why Does My Entity Framework Code Throw

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). Cela permet de supprimer le contexte et de créer un nouveau contexte pour chaque itération suivante sans encourir de conflits de transaction.

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;
    // ...
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal