PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

MultipleActiveResultSets per il modello di dati di entità postgresql e ado.net

Multiple Active Result Sets (MARS) è una funzionalità introdotta in SQL Server 2005 e non è disponibile in altri sistemi di database come Postgres, quindi non potrai attivarla nella stringa di connessione.

L'errore che stai affrontando è il risultato del tentativo di eseguire due query su un lettore di dati aperto. Quando si utilizza Entity Framework, questo solitamente succede quando hai Caricamento lento attivato e le proprietà pigre vengono caricate nello stesso lettore delle entità padre. Ad esempio un codice simile a questo potrebbe produrre questo errore:

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

Nella prima riga non vengono recuperati dati poiché abbiamo solo preparato una query Linq. Quando iniziamo il foreach un DataReader viene aperto e viene interrogata la raccolta di utenti che soddisfano le nostre condizioni ma il lettore non viene chiuso. Poi dentro foreach raggiungiamo la proprietà Address di User che è caricata in modo pigro. Questo carico lento provoca l'esecuzione di una query sullo stesso DataReader aperto ed è allora che si verifica l'eccezione. Se volessi eliminare l'errore, potrei semplicemente aggiungere un ToList() (o qualsiasi cosa che causi l'esecuzione della query) alla fine della riga in questo modo:

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

Spero che questo ti aiuterà.