Entity Framework - cykl życia
Dożywotni
Okres istnienia kontekstu rozpoczyna się po utworzeniu wystąpienia i kończy się, gdy wystąpienie zostanie usunięte lub wyrzucone do pamięci.
- Czas życia kontekstu to bardzo ważna decyzja, którą należy podjąć, gdy używamy ORMów. 
- Kontekst działa jak pamięć podręczna jednostek, co oznacza, że zawiera odwołania do wszystkich załadowanych jednostek, które mogą bardzo szybko rosnąć w zużyciu pamięci, a także mogą powodować wycieki pamięci. 
- Na poniższym diagramie można zobaczyć górny poziom przepływu danych z aplikacji do bazy danych za pośrednictwem kontekstu i odwrotnie. 
 
                Cykl życia jednostki
Cykl życia jednostki opisuje proces, w którym jednostka jest tworzona, dodawana, modyfikowana, usuwana itp. Jednostki mają wiele stanów w trakcie swojego istnienia. Zanim przyjrzymy się, jak pobrać stan jednostki, przyjrzyjmy się, co to jest stan jednostki. Stan jest wyliczeniem typuSystem.Data.EntityState który deklaruje następujące wartości -
- Added: Jednostka jest oznaczona jako dodana. 
- Deleted: Jednostka jest oznaczona jako usunięta. 
- Modified: Jednostka została zmodyfikowana. 
- Unchanged: Jednostka nie została zmodyfikowana. 
- Detached: Jednostka nie jest śledzona. 
Zmiany stanu w cyklu życia jednostki
Czasami stan jednostek jest ustawiany automatycznie przez kontekst, ale może być również modyfikowany ręcznie przez dewelopera. Mimo że wszystkie kombinacje przełączeń z jednego stanu do drugiego są możliwe, ale niektóre z nich są bez znaczenia. Na przykład,Added podmiot do Deleted stan lub odwrotnie.
Porozmawiajmy o różnych stanach.
Stan niezmieniony
- Gdy jednostka jest niezmieniona, jest powiązana z kontekstem, ale nie została zmodyfikowana. 
- Domyślnie w tym stanie jest jednostka pobrana z bazy danych. 
- Gdy jednostka jest dołączona do kontekstu (za pomocą metody Attach), podobnie jest w stanie niezmienionym. 
- Kontekst nie może śledzić zmian w obiektach, do których się nie odwołuje, więc po dołączeniu zakłada, że są niezmienione. 
Stan odłączony
- Odłączony jest stanem domyślnym nowo utworzonej jednostki, ponieważ kontekst nie może śledzić tworzenia żadnego obiektu w kodzie. 
- Dzieje się tak nawet wtedy, gdy utworzysz wystąpienie jednostki wewnątrz using bloku kontekstu. 
- Odłączony jest nawet stan jednostek pobranych z bazy danych, gdy śledzenie jest wyłączone. 
- Gdy jednostka jest odłączona, nie jest powiązana z kontekstem, więc jej stan nie jest śledzony. 
- Można go wyrzucić, zmodyfikować, wykorzystać w połączeniu z innymi klasami lub wykorzystać w inny sposób, jakiego potrzebujesz. 
- Ponieważ nie ma śledzenia kontekstu, nie ma to znaczenia dla Entity Framework. 
Dodano stan
- Gdy jednostka jest w stanie Dodano, masz kilka opcji. W rzeczywistości możesz tylko oderwać go od kontekstu. 
- Oczywiście, nawet jeśli zmodyfikujesz jakąś właściwość, stan pozostanie Dodany, ponieważ przeniesienie jej do Zmodyfikowana, Niezmieniona lub Usunięta nie ma sensu. 
- Jest to nowa jednostka i nie ma korespondencji z wierszem w bazie danych. 
- Jest to podstawowy warunek przebywania w jednym z tych stanów (ale ta zasada nie jest wymuszana przez kontekst). 
 
                Stan zmodyfikowany
- Gdy jednostka jest modyfikowana, oznacza to, że była w stanie niezmienionym, a następnie została zmieniona pewna właściwość. 
- Gdy jednostka przejdzie w stan zmodyfikowany, może przejść do stanu odłączony lub usunięty, ale nie może przywrócić stanu niezmienionego, nawet jeśli ręcznie przywrócisz oryginalne wartości. 
- Nie można go nawet zmienić na Dodano, chyba że odłączysz i dodasz jednostkę do kontekstu, ponieważ wiersz o tym identyfikatorze już istnieje w bazie danych i podczas utrwalania wystąpi wyjątek środowiska uruchomieniowego. 
Stan usunięty
- Jednostka przechodzi w stan Usunięty, ponieważ była niezmieniona lub zmodyfikowana, a następnie została użyta metoda DeleteObject. 
- Jest to najbardziej restrykcyjny stan, ponieważ nie ma sensu przechodzenie z tego stanu na jakąkolwiek inną wartość poza Odłączonym. 
Plik usinginstrukcja, jeśli chcesz, aby wszystkie zasoby kontrolowane przez kontekst zostały usunięte na końcu bloku. Kiedy używaszusing , a następnie kompilator automatycznie tworzy blok try / final i wywołuje dispose w bloku last.
using (var context = new UniContext()) {
   var student = new Student {
      LastName = "Khan", 
      FirstMidName = "Ali", 
      EnrollmentDate = DateTime.Parse("2005-09-01")
   };
   context.Students.Add(student);
   context.SaveChanges();
}Podczas pracy z długotrwałym kontekstem rozważ następujące kwestie -
- Gdy ładujesz więcej obiektów i ich odniesień do pamięci, zużycie pamięci przez kontekst może szybko wzrosnąć. Może to powodować problemy z wydajnością. 
- Pamiętaj, aby pozbyć się kontekstu, gdy nie jest już potrzebny. 
- Jeśli wyjątek powoduje, że kontekst jest w stanie nieodwracalnym, cała aplikacja może zostać zakończona. 
- Szanse na wystąpienie problemów związanych ze współbieżnością rosną wraz ze wzrostem odstępu między momentem odpytywania danych a aktualizacją. 
- Podczas pracy z aplikacjami internetowymi używaj instancji kontekstu na żądanie. 
- Podczas pracy z Windows Presentation Foundation (WPF) lub Windows Forms użyj wystąpienia kontekstu na formularz. Umożliwia to korzystanie z funkcji śledzenia zmian, którą zapewnia kontekst. 
Reguły kciuka
Web Applications
- Obecnie powszechną i najlepszą praktyką jest to, że w przypadku aplikacji internetowych kontekst jest używany na żądanie. 
- W aplikacjach internetowych mamy do czynienia z żądaniami, które są bardzo krótkie, ale zawierają wszystkie transakcje na serwerze, dlatego mają odpowiedni czas trwania dla kontekstu. 
Desktop Applications
- W przypadku aplikacji komputerowych, takich jak Win Forms / WPF, itp. Kontekst jest używany na formularz / okno dialogowe / stronę. 
- Ponieważ nie chcemy mieć kontekstu jako singletonu dla naszej aplikacji, pozbędziemy się go, gdy przejdziemy z jednego formularza do drugiego. 
- W ten sposób zdobędziemy wiele możliwości kontekstu i nie będziemy cierpieć z powodu konsekwencji długotrwałych kontekstów.