Mam projekt na MVC. Wybraliśmy EF dla naszych transakcji DB. Stworzyliśmy kilku menadżerów dla warstwy BLL. Znalazłem wiele przykładów, w których używany jest „using
” oświadczenie, tjWykorzystanie EF (entity framework) instrukcji "using"
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
Tutaj tworzymy nową instancję DBcontext MyEntities()
. Używamy "using
", aby uzyskać "ensure the correct use of IDisposable objects."
To tylko jedna metoda w moim managerze. Ale mam ich więcej niż dziesięć. Za każdym razem, gdy wywołuję dowolną metodę z menedżera, używam "using
", a następnie statemant i tworzę kolejny DBcontext w pamięci. Kiedy garbage collector (GC) wyrzuci je? Kto wie?
Istnieje jednak inna możliwość zastosowania metod menedżera. Tworzymy zmienną globalną:
private readonly MyEntities db = new MyEntities();
i używać DBcontext w każdej metodzie bez „using
” oświadczeniu. I metoda wygląda następująco:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Pytania:
- Jaki jest właściwy sposób używając zmiennej DBcontext?
- Co by było, gdybyśmy nie używali oświadczenia "
usage
" (ponieważ wpływa to na wydajność) - GC zrobi wszystko za to?
Jestem "nowicjuszem" w używaniu EF i nadal nie znalazłem jednoznacznej odpowiedzi na to pytanie.
Zależy od tego, jak daleko chcesz to zrobić. Najlepiej byłoby, gdybyś nie stworzył go w swoim kontrolerze, ale zamiast tego ** Inject ** it (IoC/DI) w ten sposób, niezależnie od tego, który kontroler wywołujący (Factory) może określić czas życia Kontekstu. – Belogix
Dlaczego wpływa to na wydajność? Zmierzyłeś go i doszedłeś do wniosku, że tracisz wydajność? A GC go nie wyrzuca, sam je wyrzucasz, ponieważ używasz instrukcji użycia. – Maarten