Entity Framework - odłączone jednostki

W tym rozdziale przyjrzyjmy się, jak wprowadzać zmiany w obiektach, które nie są śledzone przez kontekst. Jednostki, które nie są śledzone przez kontekst, nazywane są jednostkami „odłączonymi”.

  • W przypadku większości aplikacji jednowarstwowych, w których interfejs użytkownika i warstwy dostępu do bazy danych działają w tym samym procesie aplikacji, prawdopodobnie będziesz wykonywać operacje na jednostkach śledzonych przez kontekst.

  • Operacje na odłączonych jednostkach są znacznie częstsze w aplikacjach N-warstwowych.

  • Aplikacje N-warstwowe obejmują pobieranie pewnych danych z serwera i zwracanie ich przez sieć na komputer kliencki.

  • Następnie aplikacja kliencka przetwarza te dane przed zwróceniem ich na serwer w celu ich utrwalenia.

Poniżej znajdują się dwa kroki, które należy wykonać w przypadku odłączonego wykresu encji lub nawet pojedynczego odłączonego obiektu.

  • Dołącz jednostki do nowej instancji kontekstu i poinformuj kontekst o tych jednostkach.

  • Ustaw odpowiednie EntityStates na te jednostki ręcznie.

Przyjrzyjmy się poniższemu kodowi, w którym jednostka Student jest dodawana z dwiema jednostkami rejestracji.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram", 

         EnrollmentDate = DateTime.Parse("2015-10-10"), 
            Enrollments = new List<Enrollment> {

               new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
               new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
         }
      };

      using (var context = new UniContextEntities()) {

         context.Students.Add(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", 
               enrollment.EnrollmentID, context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   } 
}
  • Kod tworzy nowe wystąpienie Student, które również odwołuje się do dwóch nowych wystąpień Enrollment we właściwości Enrollments.

  • Następnie nowy Student jest dodawany do kontekstu przy użyciu metody Add.

  • Po dodaniu ucznia kod używa metody DbContext.Entry, aby uzyskać dostęp do informacji o śledzeniu zmian, które Entity Framework ma na temat nowego ucznia.

  • Na podstawie tych informacji o śledzeniu zmian właściwość State służy do zapisywania bieżącego stanu jednostki.

  • Ten proces jest następnie powtarzany dla każdej nowo utworzonej Rejestracji, do której odwołuje się nowy Uczeń. Jeśli uruchomisz aplikację, otrzymasz następujące dane wyjściowe -

New Student   (Wasim  Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...

Podczas gdy DbSet.Add jest używany do informowania Entity Framework o nowych jednostkach, DbSet.Attach służy do informowania Entity Framework o istniejących jednostkach. Metoda Attach spowoduje oznaczenie jednostki w stanie niezmienionym.

Przyjrzyjmy się poniższemu kodowi C #, w którym odłączona jednostka jest dołączona do DbContext.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram",
         EnrollmentDate = DateTime.Parse("2015-10-10"), 

         Enrollments = new List<Enrollment> {
            new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
            new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
         }
			
      };

      using (var context = new UniContextEntities()) {

         context.Students.Attach(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID, 
               context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   }
}

Gdy powyższy kod zostanie wykonany metodą Attach (), otrzymasz następujące dane wyjściowe.

New Student   (Wasim  Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...