PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

MultipleActiveResultSets pour le modèle de données d'entité postgresql et ado.net

MARS (Multiple Active Result Sets) est une fonctionnalité introduite dans SQL Server 2005 et n'est pas disponible dans d'autres systèmes de base de données comme postgres, vous ne pourrez donc pas l'activer dans la chaîne de connexion.

L'erreur que vous rencontrez est le résultat d'une tentative d'exécution de deux requêtes sur un lecteur de données ouvert. Lorsque vous utilisez ie Entity Framework, cela habituellement se produit lorsque vous avez un chargement différé activé et les propriétés paresseuses sont chargées dans le même lecteur que les entités parentes. Par exemple, un code similaire à celui-ci pourrait produire cette erreur :

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha"));
foreach (var user in users)
{
    Console.WriteLine(user.Address.StreetName);
}

Dans la 1ère ligne, aucune donnée n'est récupérée car nous n'avons préparé qu'une requête Linq. Lorsque nous démarrons le foreach un DataReader est ouvert et la collection d'utilisateurs qui répond à nos conditions est interrogée mais le lecteur n'est pas fermé. Puis à l'intérieur de foreach nous atteignons la propriété Address de User qui est chargée paresseusement. Ce chargement différé provoque l'exécution d'une requête sur le même DataReader ouvert et c'est là que l'exception se produit. Si je voulais me débarrasser de l'erreur, je pourrais simplement ajouter un ToList() (ou tout ce qui provoque l'exécution de la requête) à la fin de la ligne comme ceci :

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha")).ToList();

J'espère que cela vous aidera.