2010-04-04 9 views
7

ci sono state molte domande sulla gestione EntityContext vita,Managing EntityConnection vita

esempio Instantiating a context in LINQ to Entities

Sono giunto alla conclusione che il contesto dell'entità dovrebbe essere considerato un'unità di lavoro e quindi non riutilizzato. Grande.

Ma mentre facendo qualche ricerca per accelerare il mio accesso al database, mi sono imbattuto in questo post del blog ...

Improving Entity Framework Performance

Il post sostiene che EF di scarso rendimento rispetto ad altri framework è spesso dovuto al EntityConnection oggetto creato ogni volta che è necessario un nuovo oggetto EntityContext.

Per verificare ciò, ho creato manualmente una EntityConnection statica in Global.asax.cs Application_Start().

Allora ho convertito tutto il mio contesto utilizzando dichiarazioni per

using(MyObjContext currContext = new MyObjeContext(globalStaticEFConnection) 
{ 
    .... 
} 

Questo sembra avere le cose accelerato un po 'senza errori fino ad ora, per quanto posso dire.

Ma questo è sicuro?

L'utilizzo di una funzione statica EntityConnection introduce condizioni di gara?

Con i migliori saluti, Kervin

+0

Questo probabilmente inizierà una guerra santa. ;) – Nix

risposta

7

EntityConnection is documented to be not thread-safe. Penso che potresti raggrupparli, ma non puoi usare una singola connessione statica per un'applicazione Web, poiché ci saranno molti thread coinvolti.

+0

Grazie. Ero certo che non sarebbe stato così facile, ma sto praticamente cercando di capire se qualcuno là fuori sta mettendo in comune le connessioni per le prestazioni. Dal momento che quel post sul blog MSDN ha fatto un buon esempio. – kervin

+0

Non cambierei nulla senza ripetere il test in .NET 4. Questo potrebbe già essere stato risolto. –

2
  • Se il contesto EF è ampia Application-, ritengono che l'utente A ha apportato modifiche (non impegnati) & l'utente B ha commesso i suoi cambiamenti, tutte le modifiche sarà ottenere impegnati a il database poiché entrambi gli utenti A & B utilizzano la stessa istanza

  • Nel mio progetto, ho eseguito una richiesta Web per il contesto EF, ad es. un oggetto di contesto è statico dall'inizio alla fine di una richiesta Web & tutte le operazioni in quella richiesta funzionano con lo stesso contesto EF. Ciò ha velocizzato significativamente la mia elaborazione senza il problema menzionato sopra.

Un modo per implementare questo è utilizzare un contenitore DI (sto utilizzando Unity) per gestire la durata del contesto EF. Il gestore della durata per richiesta web non è fornito in Unity, ma ci sono un sacco di articoli là fuori che mostrano come questo può essere fatto.

HTH.

+1

Ciao grazie, ma il mio EntityContext non è un'applicazione larga. L'EntityConnection che usa è. Sto usando EntityContext come "unità di lavoro", vale a dire. un nuovo contesto con ogni accesso fondamentalmente. – kervin