2015-06-19 13 views
6

In un'applicazione che ho ereditato, è presente in un controller di base, dal quale ereditano tutti gli altri controller dell'applicazione.DbContext e pool di connessione

public BaseController() 
    { 
     db = new MyDbContext(); 

     db.Database.Log = s => Debug.Write(s); 
    } 

public MyDbContext() 
     : base("name=MyDbContext") 
    { 
     // hack to force Visual Studio to deploy the Entityframework.SqlServer package 
     var instance = SqlProviderServices.Instance; 
    } 

A causa del modo in cui l'applicazione è stata progettata, vengono creati almeno 2 contesti per richiesta. (È un'applicazione MVC e c'è una chiamata a HomeController su ogni pagina più qualsiasi altro controller viene chiamato per una pagina specifica.)

La mia domanda è quando la DbContext crea una connessione a SQL Server? È immediato quando viene creato il contesto o solo quando viene eseguita una query?

Se è il primo, allora utilizzerò il doppio del numero di connessioni al server SQL del necessario e, se è il secondo, probabilmente non è un problema.

Non credo di poterlo refactoring nell'immediato futuro, certamente non senza giustificazione. Quali potenziali insidie ​​di questo design dovrei essere a conoscenza?

Entity Framework 6.1.3

+0

Quale versione di EF è questo?E puoi mostrarci il costruttore di 'MyDbContext'? Ciò fornirà i dettagli necessari per rispondere alla tua domanda. – sstan

+0

Aggiornamento della domanda – MrBliz

risposta

3

Poiché non si sta tentando di creare e passare una connessione da soli nel costruttore del contesto, quindi, come altri stanno dicendo, EF otterrà/rilascerà le connessioni da un pool di connessioni, se necessario, non quando è stato creato.

Avviso questa citazione dalla documentazione EF:

Connessioni

Per impostazione predefinita, il contesto gestisce le connessioni al database. Il contesto apre e chiude le connessioni secondo necessità. Ad esempio, il contesto apre una connessione per eseguire una query e quindi chiude la connessione quando tutti i set di risultati sono stati elaborati.

Ci sono casi in cui si desidera avere maggiore controllo su quando la connessione si apre e si chiude. Ad esempio, quando si lavora con SQL Server Compact, l'apertura e la chiusura della stessa connessione sono costose. È possibile gestire questo processo manualmente utilizzando la proprietà Connessione.

Vedere i seguenti link per ulteriori informazioni:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849

1

connessione viene aperta solo quando si esegue una query. Il pool di connessione è gestito da classi ADO.NET (SqlConnection). Avere più istanze di DbContext per richiesta va bene e talvolta è necessario. Non avrai il doppio numero di connessioni in generale.

3

Entity Framework segue il principio Open late and close early. Quindi, apre la connessione solo quando è necessario, IE per materializzare una query, quindi la chiude appena possibile.

Se possibile, è necessario passare a una singola istanza di contesto per richiesta. Ciò mantiene anche tutto ciò che accade durante la richiesta in un'unica transazione. È possibile farlo abbastanza facilmente se si utilizza un contenitore di iniezione di dipendenza per istanziare i controller.

Problemi correlati