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...