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.