2015-08-29 13 views
10

W środowisku C# MVC EF, widziałem wiele przykładów, które po prostu tworzy nowy DbContext, gdy potrzebna jest wstawka lub zapytanie, a następnie zamknij/zwolnij (wielu używa "używania" do automatycznego zamykania/wydawania).Czy DbContext jest kosztowną operacją?

Czy niektóre wyszukiwania w tej sprawie, ale nie może znaleźć dobrej odpowiedzi, ale tworzy DbContext bardzo tanie i szybkie działanie?

Na przykład, myśląc o typowej aplikacji MVC, na stronie znajduje się wiele "komponentów", takich jak nagłówki, paski boczne, główna zawartość itp., A także w nietrywialnej konfiguracji, każdy komponent będzie miał swoje własna indywidualna logika i kod - czy w każdym z tych składników powinienem utworzyć nowy DbContext? (jeśli tak, to czy system automatycznie buforuje wynik zapytania? - na przykład powszechnym przypadkiem użycia jest to, że w każdym z tych składników musi on wyszukiwać w bazie danych bieżące ustawienia witryny, które są tym samym wierszem w stół).

+2

To jest coś, co * łatwo * przetestowane i obserwowane przez * ciebie *. Wypróbuj i przekonaj się! –

+0

@ Cubicle.Jockey Gdzie indziej ma to zrobić? Kontroler wydaje się być dobrym miejscem. –

+0

Nie zamieszczam tego jako odpowiedzi, ponieważ nie mogę znaleźć oryginalnej strony w MSDN, ale konteksty są przygotowane do tworzenia i niszczenia wydajnie, jedyną częścią kosztowną w tworzeniu kontekstu jest zależne połączenie DB i EF będzie zarządzaj nim, nie zamknie go po zniszczeniu kontekstu, ma pulę wewnętrzną, która zarządza nimi – Gusman

Odpowiedz

10

Jak zaznaczono w „Performance Considerations for Entity Framework 4, 5 and 6” § 9.3 (kopalnia nacisk):

konteksty Entity Framework są przeznaczone do pracy w sytuacjach krótkotrwałych w celu zapewnienia najbardziej optymalnego doświadczenia wydajności. Przewiduje się, że konteksty będą krótkotrwałe i odrzucone, i jako takie zostały wdrożone jako bardzo lekkie i ponownie wykorzystują metadane, gdy tylko jest to możliwe. W scenariuszach internetowych ważne jest, aby o tym pamiętać i nie mieć kontekstu przez dłużej niż czas trwania pojedynczego żądania. Podobnie w scenariuszach innych niż internetowe kontekst powinien zostać odrzucony w oparciu o twoje zrozumienie różnych poziomów buforowania w Entity Framework. Ogólnie mówiąc, należy unikać instancji kontekstu przez cały okres istnienia aplikacji, a także kontekstów dla wątku i kontekstów statycznych..

+0

dzięki za link. bardzo pomocne! – Phil

1

Można użyć wtrysku, jak w przypadku Unity, który umożliwi utworzenie pojedynczego wystąpienia DbContext, gdy żądanie przychodzi i wstrzykuje je tam, gdzie jest to potrzebne. Z Unity wierzę, że możesz określić, czy tworzone jest jedno wystąpienie na żądanie, czy też za każdym razem tworzone jest nowe.

Tworzenie DbContext jest bardzo powolne, gdziekolwiek tego potrzebujesz, ale jest to trochę rozsądne, więc użyj tego, co już masz, jeśli możesz i jeśli koncentrujesz się na wydajności w odniesieniu do zapytań do bazy danych, to tam zawsze będzie kosztować korzystania z dowolnej ORM. To jest kompromis z wygodą.

Proponuję również użyć czegoś takiego jak Glimpse, który pozwala zobaczyć wszystkie zapytania i połączenia, które były używane do renderowania strony, w tym zapytania ajaxowe i daje doskonały przegląd tego, co się dzieje. Czasami może być trochę przerażająco!

Powiązane problemy