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'?

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'?

DDD
DDDoriginal
2025-01-29 21:56:09382parcourir

Why Does Entity Framework Throw

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!

Déclaration:
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