- Pula połączeń jest obsługiwana jak w każdej innej aplikacji ADO.NET. Połączenie encji nadal korzysta z tradycyjnego połączenia z bazą danych z tradycyjnym ciągiem połączenia. Wierzę, że możesz wyłączyć pulowanie połączeń w ciągu połączenia, jeśli nie chcesz go używać. (czytaj więcej o SQL Server Connection Pooling (ADO.NET) )
- Nigdy nie używaj globalnego kontekstu. ObjectContext wewnętrznie implementuje kilka wzorców, w tym mapę tożsamości i jednostkę pracy. Wpływ korzystania z kontekstu globalnego jest różny w zależności od typu aplikacji.
- W przypadku aplikacji internetowych użyj pojedynczego kontekstu na żądanie. W przypadku usług internetowych użyj jednego kontekstu na połączenie. W aplikacji WinForms lub WPF używaj pojedynczego kontekstu na formularz lub na prezentera. Mogą istnieć pewne specjalne wymagania, które nie pozwolą na zastosowanie tego podejścia, ale w większości przypadków to wystarczy.
Jeśli chcesz wiedzieć, jaki wpływ ma kontekst jednego obiektu dla aplikacji WPF / WinForm, sprawdź ten artykuł . Chodzi o sesję NHibernate, ale pomysł jest taki sam.
Edytować:
Gdy używasz EF, domyślnie ładuje każdą jednostkę tylko raz na kontekst. Pierwsze zapytanie tworzy instancję encji i przechowuje ją wewnętrznie. Każde kolejne zapytanie, które wymaga encji o tym samym kluczu, zwraca tę przechowywaną instancję. Jeśli wartości w magazynie danych ulegną zmianie, nadal otrzymasz encję z wartościami z początkowego zapytania. Nazywa się to wzorem mapy tożsamości . Możesz zmusić kontekst obiektu do przeładowania bytu, ale przeładuje on jedną udostępnioną instancję.
Wszelkie zmiany dokonane w encji nie są utrwalane, dopóki nie zadzwonisz SaveChanges
w kontekście. Możesz wprowadzać zmiany w wielu jednostkach i przechowywać je jednocześnie. Jest to tak zwany wzorzec jednostki pracy . Nie możesz selektywnie powiedzieć, który zmodyfikowany dołączony element chcesz zapisać.
Połącz te dwa wzory, a zobaczysz kilka interesujących efektów. Masz tylko jedną instancję encji dla całej aplikacji. Wszelkie zmiany encji wpływają na całą aplikację, nawet jeśli zmiany nie zostały jeszcze utrwalone (zatwierdzone). W większości przypadków nie tego chcesz. Załóżmy, że masz formularz edycji w aplikacji WPF. Pracujesz z jednostką i decydujesz się anulować złożoną edycję (zmienianie wartości, dodawanie powiązanych jednostek, usuwanie innych powiązanych jednostek itp.). Ale jednostka jest już zmodyfikowana w kontekście współdzielonym. Co zrobisz? Wskazówka: Nie wiem o żadnych zmianach Anuluj lub Cofnij zmiany ObjectContext
.
Myślę, że nie musimy omawiać scenariusza serwera. Po prostu współużytkowanie jednego elementu między wieloma żądaniami HTTP lub połączeniami z usługami sieci Web sprawia, że aplikacja nie jest potrzebna. Każde żądanie może po prostu uruchomić SaveChanges
i zapisać częściowe dane z innego żądania, ponieważ dzielisz jedną jednostkę pracy między nimi wszystkimi. Będzie to również miało inny problem - kontekst i wszelkie manipulacje z obiektami w kontekście lub połączenie z bazą danych używane przez kontekst nie są bezpieczne dla wątków.
Nawet w przypadku aplikacji przeznaczonej tylko do odczytu kontekst globalny nie jest dobrym wyborem, ponieważ zapewne potrzebne są świeże dane przy każdym zapytaniu do aplikacji.