Maison >développement back-end >C++ >Pourquoi l'entité Framework lance-t-il 'Il y a déjà un chef de données ouvert associé à cette commande qui doit être fermée en premier'?
Erreur "Open DataReader" de l'entité Framework: un piège commun
Les cadres d'entité modernes simplifient les interactions de la base de données, mais l'erreur "il y a déjà un réacteur ouvert associé à cette commande qui doit être fermé en premier" reste un mal de tête fréquent. Cet article explique la cause profonde et fournit une solution.
Considérez ce scénario: une requête récupère les données du compte, puis effectue un traitement ultérieur:
<code class="language-csharp">var accounts = from account in context.Accounts from guranteer in account.Gurantors select new AccountsReport { CreditRegistryId = account.CreditRegistryId, AccountNumber = account.AccountNo, DateOpened = account.DateOpened, }; return accounts.AsEnumerable() .Select((account, index) => new AccountsReport() { RecordNumber = FormattedRowNumber(account, index + 1), CreditRegistryId = account.CreditRegistryId, DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber), AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber) }) .OrderBy(c=>c.FormattedRecordNumber) .ThenByDescending(c => c.StateChangeDate);</code>
La méthode DateLastUpdated
, illustrée ci-dessous, ajoute une autre requête de base de données:
<code class="language-csharp">public DateTime DateLastUpdated(long creditorRegistryId, string accountNo) { return (from h in context.AccountHistory where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo select h.LastUpdated).Max(); }</code>
le problème? La requête principale ouvre un DataReader
. DateLastUpdated
ouvre un autre sans fermer le premier , conduisant à l'erreur.
La solution: plusieurs ensembles de résultats actifs (Mars)
La correction la plus simple consiste à activer plusieurs ensembles de résultats actifs (Mars) dans votre chaîne de connexion:
<code class="language-csharp">Data Source=myServer;Initial Catalog=myDatabase;MultipleActiveResultSets=true</code>
Mars permet à la base de données de gérer plusieurs curseurs ouverts simultanément, empêchant le conflit et résolvant l'erreur "Open DataReader". Cela évite le besoin de fermeture manuelle DataReader
, simplifiant votre code.
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!