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