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.