Ho un progetto su MVC. Abbiamo scelto EF per le nostre transazioni DB. Abbiamo creato alcuni gestori per il livello BLL. Ho trovato un sacco di esempi, in cui si utilizza "using
" l'istruzione, vale a direUso di EF (entità framework) dell'istruzione "using"
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
Qui creiamo una nuova istanza di DbContext MyEntities()
. Utilizziamo "using
" per "ensure the correct use of IDisposable objects."
È solo un metodo nel mio manager. Ma ne ho più di dieci. Ogni volta che chiamo un metodo dal gestore, userò lo statino "using
" e lo creerà un altro DBcontext nella memoria. Quando Garbage Collector (GC) li smaltirà? Chissà?
Ma esiste un'altra alternativa all'utilizzo dei metodi di gestione. Creiamo una variabile globale:
private readonly MyEntities db = new MyEntities();
e usiamo DbContext in ogni metodo senza "using
" dichiarazione. E il metodo è simile al seguente:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Domande:
- Qual è il modo corretto di usare variabili DbContext?
- E se non usassimo la frase "
usage
" (perché influisce sulle prestazioni) - GC farà tutto per quello?
Sono un "debuttante" in uso EF e ancora non ho trovato la risposta univoca per questa domanda.
Dipende quanto lontano si vuole prendere. Idealmente non lo istanziate affatto nel controller, ma invece ** Inietti ** (IoC/DI) in questo modo qualunque cosa stia chiamando controller (Factory) può determinare la durata del Context. – Belogix
Perché influisce sulle prestazioni? L'hai misurato e hai concluso che stai perdendo le prestazioni? E il GC non lo sta smaltendo, lo stai smaltendo da solo poiché stai usando le istruzioni using. – Maarten