6

Devo ricalcolare i valori su una vasta raccolta di entità, una dopo l'altra.Molte query e troppa apertura/chiusura della stessa connessione

Durante questo processo, tutte le entità di auto-rilevamento vengono modificate all'interno dello stesso ObjectContext. Per ciascuna entità che deve essere elaborata, è necessario recuperare piccole quantità di dati dal database. Ciò si traduce in molte delle stesse query SQL ma utilizzando parametri diversi.

Sto usando Software ORM Profiler Solutions per profilare le query inviate al database.

Le domande stesse mi sembrano a posto. Sono brevi e non richiedono molto tempo per essere eseguiti.

Tuttavia, io sono confuso su come il profiler mi mostra come le query sono in realtà trattati:

enter image description here

Come si può vedere, continua apertura e chiusura della stessa connessione al database.

Ora, date un'occhiata alle volte per un unico aperto/Query/Chiude la connessione:

enter image description here

Sembra che l'apertura e la chiusura di un database tempo rifiuti di connessione.

Dopo aver letto this answer, ho cambiato il mio codice in modo ora sembra che questo:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString)) 
{ 
    using (var context = new MyEntities(connection)) 
    { 
     // ... 

ora posso vedere che sta ancora utilizzando la stessa connessione (che è buono), ma, la connessione ancora continua a chiudersi e ad aprirsi tra le domande.

Gert Arnold suggerito di aprire esplicitamente la connessione prima di utilizzare il contesto. Ho quindi modificato il mio codice in modo che assomigli a questo:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString)) 
{ 
    connection.Open(); 
    using (var context = new MyEntities(connection)) 
    { 
     // ... 

Ora funziona! Ogni query viene inviata alla stessa connessione al database:

enter image description here

adesso sono curioso di motivo per cui ho bisogno di aprire la connessione prima di utilizzare il contesto?

+0

Questo non è un duplicato. Posso effettivamente riutilizzare la stessa connessione. Il problema è che continua ad aprirsi/chiudersi tra le query. –

+1

Si chiude anche quando si apre la connessione prima di creare il contesto? (A proposito, penso che il tuo codice non sia completamente corretto: 'new EntityConnection' due volte). –

+0

Funziona! Ma solo se, come hai suggerito, apro esplicitamente la connessione prima di usare il contesto. Sai perché ? –

risposta

4

È possibile creare un contesto con una connessione esistente. È difficile trovare la documentazione su di esso, ma se la connessione viene aperta esplicitamente prima che il contesto la utilizzi, rimarrà aperta fino a quando non viene chiusa o eliminata esplicitamente. Ho testato questo con un EF5 ObjectContext (codice LINQPad):

using (var conn = new EntityConnection(connectionString)) 
{ 
    conn.Open(); 
    using (var db = new InventoryContext(conn)) 
    { 
     db.Products.ToList(); 
     conn.State.Dump(); 
     db.SaveChanges(); 
     conn.State.Dump(); 
    } 
} 

L'uscita è Open, Open. Quando la connessione non viene aperta, l'uscita è Closed, Closed.

+0

Grazie mille! Funziona perfettamente aprendo esplicitamente la connessione prima di utilizzare il contesto. Ho modificato la mia domanda per mostrare i risultati. –

1

Un'altra soluzione potrebbe essere quella di aprire la connessione quando il DbContext è costruito:

public partial class QueryModel : DbContext 
{ 
    public QueryModel(string connectionName):base(connectionName) 
    { 
     this.Database.Connection.Open(); 
    } 
} 
Problemi correlati