8

Abbiamo una libreria di classi statiche per gestire attività multi-contestuali ripetute. È una cattiva pratica creare un contesto EF db come membro di una classe statica?Pro e contro di mettere un contesto db nella libreria di classi statiche

I contesti DB devono essere smaltiti per un motivo. Avendoli disposti di frequente mantiene il pool di connessioni "scorrevole" e probabilmente (qui sto speculando) assicura che le tabelle non restino bloccate.

Quindi sto invitando problemi con un contesto db in una classe statica o sto pensando troppo a questo?

risposta

14

IMO questo non è assolutamente qualcosa che si vuole fare.

Il blocco non è in realtà il problema principale che si verificherà qui. EF si bloccherà solo per la durata di una chiamata di salvataggio delle modifiche (in realtà è uno dei grandi vantaggi dell'utilizzo di un grafico di tracciamento sulle transazioni parzialmente impegnate utilizzate dalla maggior parte degli ORM).

Che cosa sta per causare greif è il grafico di tracciamento stesso. Il modo in cui EF funziona (nella maggior parte dei casi) è che mantiene una copia di ogni entità mai vista e scorre attraverso di essi per trovare che cosa è cambiato ed eseguire un processo chiamato fixup che rende le proprietà di navigazione funzionanti con backlink. Questo processo scorre attraverso tutte le entità che il contesto ha mai visto e viene chiamato su una serie di operazioni (aggiungere, allegare, eliminare, salvare, interrogare e pochi altri). Ciò significa che se il grafico di tracciamento è grande, questo processo può richiedere un po 'di tempo. Se mantieni il tuo contesto in vita per sempre, le dimensioni del grafico di tracciamento tendono verso la dimensione del tuo database, rendendolo poco maneggevole e lento.

+0

Grazie per la conferma. Sono d'accordo. –

+2

@davea In un po 'di sidenote utilizzo l'injection dependency per gestire il ciclo di vita del contesto, con una nuova istanza per richiesta (in uno scenario Web) o una nuova istanza ogni volta. –

+0

Luke, ho letto di DI come schema e ne capisco il valore. Usare un framework come Ninject mi può aiutare qui? –

6

Dipende da molte cose, ma qui ci sono alcune riflessioni ad esempio:

  • Se stai usando EF sul livello di servizio - allora la concorrenza potrebbe essere un problema in quanto non credo che l'utilizzo di contesto EF è thread-safe, vale a dire che puoi usarlo da tutti i thread contemporaneamente senza problemi
  • Se le tue entità sono tracciate dal contesto (e penso che anche se non lo fai), il contesto col tempo diventerebbe abbastanza grande, alla fine potrebbe contenere tutte le entità del database e quindi si correranno problemi di prestazioni

In entrambi i casi, penso che sia una cattiva idea.

+0

Grazie per la conferma. Sono d'accordo. –