2015-06-19 11 views
6

W aplikacji, którą odziedziczyłem, jest to w kontrolerach podstawowych, z których każdy inny kontroler w aplikacji dziedziczy.DbContext i pule połączeń

public BaseController() 
    { 
     db = new MyDbContext(); 

     db.Database.Log = s => Debug.Write(s); 
    } 

public MyDbContext() 
     : base("name=MyDbContext") 
    { 
     // hack to force Visual Studio to deploy the Entityframework.SqlServer package 
     var instance = SqlProviderServices.Instance; 
    } 

Ze względu na sposób zaprojektowania aplikacji, na każde żądanie tworzone są co najmniej 2 konteksty. (Jest to aplikacja MVC i jest wywołanie HomeController na każdej stronie oraz wszystkie inne kontrolery są wywoływane dla konkretnej strony.)

Moje pytanie brzmi: kiedy DbContext tworzy połączenie z SQL Server? Czy jest to natychmiast po utworzeniu kontekstu, czy tylko po wykonaniu zapytania?

Jeśli jest to pierwsze, użyję 2 razy dwa razy więcej połączeń do serwera SQL niż jest to potrzebne, a jeśli jest to drugie, to prawdopodobnie nie jest to zbyt duży problem.

Nie sądzę, że mogę to zmienić w najbliższej przyszłości, na pewno nie bez uzasadnienia. Jakie potencjalne pułapki tego projektu powinienem znać?

Entity Framework 6.1.3

+0

Która wersja EF to jest?Czy możesz pokazać nam konstruktor 'MyDbContext'? To da ci szczegóły potrzebne do udzielenia odpowiedzi na twoje pytanie. – sstan

+0

Zaktualizowano pytanie – MrBliz

Odpowiedz

3

Ponieważ nie próbujesz utworzyć i przekazać połączenia samodzielnie w konstruktorze kontekstu, to tak, jak mówią inni, EF będzie uzyskiwać/zwalniać połączenia z puli połączeń w razie potrzeby, a nie po jej zbudowaniu.

Wskazówka ten cytat z dokumentacji EF:

Połączenia

Domyślnie kontekst zarządza połączeniami do bazy danych. Kontekst otwiera i zamyka połączenia w razie potrzeby. Na przykład kontekst otwiera połączenie, aby wykonać zapytanie, a następnie zamyka połączenie, gdy wszystkie zestawy wyników zostały przetworzone.

Są przypadki, gdy chcesz mieć większą kontrolę nad tym, kiedy połączenie zostanie otwarte i zamknięte. Na przykład podczas pracy z programem SQL Server Compact otwieranie i zamykanie tego samego połączenia jest kosztowne. Możesz zarządzać tym procesem ręcznie, korzystając z właściwości Połączenie.

Zobacz poniższe linki, aby uzyskać więcej informacji:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849

1

połączenie jest otwarte tylko wtedy, gdy kwerenda jest wykonywana. Pula połączeń jest zarządzana przez klasy ADO.NET (SqlConnection). Posiadanie wielu instancji DbContext na żądanie jest w porządku, a czasami jest konieczne. Nie będziesz mieć podwójnej liczby połączeń w ogóle.

3

Struktura Entity Framework jest zgodna z zasadą Open late and close early. Tak więc otwiera połączenie tylko wtedy, gdy potrzebuje, IE do zmaterializowania zapytania, a następnie zamyka je tak szybko, jak to tylko możliwe.

Jeśli możesz, możesz przejść do pojedynczej instancji kontekstu na żądanie. Zachowuje to również wszystko, co dzieje się podczas żądania w pojedynczej transakcji. Możesz to zrobić całkiem łatwo, jeśli używasz kontenera Dependency Injection do tworzenia instancji kontrolerów.

Powiązane problemy