sql >> Database >  >> RDS >> PostgreSQL

MultipleActiveResultSets voor postgresql en ado.net entiteitsgegevensmodel

Multiple Active Result Sets (MARS) is een functie die is geïntroduceerd in SQL Server 2005 en is niet beschikbaar in andere databasesystemen zoals postgres, dus u kunt deze niet inschakelen in de verbindingsreeks.

De fout waarmee u wordt geconfronteerd, is het resultaat van het uitvoeren van twee query's op één open gegevenslezer. Bij gebruik van bv. Entity Framework is dit meestal gebeurt wanneer u Lazy Loading . heeft ingeschakeld en de lazy-eigenschappen worden in dezelfde lezer geladen als de bovenliggende entiteiten. Een soortgelijke code kan bijvoorbeeld deze fout produceren:

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

In de 1e regel worden geen gegevens opgehaald omdat we alleen een Linq-query hebben voorbereid. Wanneer we de foreach starten een DataReader wordt geopend en de verzameling van gebruikers die aan onze voorwaarden voldoet, wordt opgevraagd, maar de lezer wordt niet gesloten. Dan binnen foreach we bereiken de adreseigenschap van de gebruiker die lui is geladen. Deze luie belasting veroorzaakt een uitvoering van een query op dezelfde geopende DataReader en dat is wanneer de uitzondering optreedt. Als ik van de fout af wilde, zou ik eenvoudig een ToList() . kunnen toevoegen (of iets waardoor de query wordt uitgevoerd) naar het einde van de regel als volgt:

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

Ik hoop dat dit je zal helpen.



  1. SQLSTATE[HY000] [1040] Te veel verbindingen

  2. Hoe mysqli te laten werken met DELIMITER's in SQL-statements?

  3. Postgres ERROR:kon het bestand niet openen om te lezen:toestemming geweigerd

  4. Hoe rij bovenaan in mysql-query te plaatsen.