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.