Entity Framework - Nicht verbundene Entitäten
In diesem Kapitel sehen wir uns an, wie Sie Änderungen an Entitäten vornehmen, die nicht von einem Kontext verfolgt werden. Entitäten, die nicht von einem Kontext verfolgt werden, werden als "getrennte" Entitäten bezeichnet.
Bei den meisten einstufigen Anwendungen, bei denen die Benutzeroberflächen- und Datenbankzugriffsebenen im selben Anwendungsprozess ausgeführt werden, führen Sie wahrscheinlich nur Vorgänge für Entitäten aus, die von einem Kontext verfolgt werden.
Vorgänge mit nicht verbundenen Entitäten sind in N-Tier-Anwendungen weitaus häufiger.
Bei N-Tier-Anwendungen werden einige Daten auf einem Server abgerufen und über das Netzwerk an einen Clientcomputer zurückgegeben.
Die Clientanwendung bearbeitet diese Daten dann, bevor sie an den Server zurückgegeben werden, damit sie beibehalten werden.
Im Folgenden sind die beiden Schritte aufgeführt, die mit dem Diagramm für nicht verbundene Entitäten oder sogar für eine einzelne nicht verbundene Entität ausgeführt werden müssen.
Hängen Sie Entitäten an die neue Kontextinstanz an und machen Sie den Kontext auf diese Entitäten aufmerksam.
Setzen Sie die entsprechenden EntityStates manuell auf diese Entitäten.
Schauen wir uns den folgenden Code an, in dem die Schülerentität mit zwei Registrierungsentitäten hinzugefügt wird.
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();
}
}
}
Der Code erstellt eine neue Student-Instanz, die in ihrer Enrollments-Eigenschaft auch auf zwei neue Enrollment-Instanzen verweist.
Anschließend wird der neue Schüler mithilfe der Add-Methode einem Kontext hinzugefügt.
Sobald der Student hinzugefügt wurde, verwendet der Code die DbContext.Entry-Methode, um Zugriff auf die Änderungsverfolgungsinformationen zu erhalten, die Entity Framework über den neuen Student hat.
Aus diesen Änderungsverfolgungsinformationen wird die State-Eigenschaft verwendet, um den aktuellen Status der Entität zu schreiben.
Dieser Vorgang wird dann für jede der neu erstellten Anmeldungen wiederholt, auf die vom neuen Schüler verwiesen wird. Wenn Sie die Anwendung ausführen, erhalten Sie die folgende Ausgabe:
New Student (Wasim Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...
Während DbSet.Add verwendet wird, um Entity Framework über neue Entitäten zu informieren, wird DbSet.Attach verwendet, um Entity Framework über vorhandene Entitäten zu informieren. Die Attach-Methode markiert eine Entität im unveränderten Zustand.
Schauen wir uns den folgenden C # -Code an, in dem eine nicht verbundene Entität mit DbContext verbunden ist.
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();
}
}
}
Wenn der obige Code mit der Attach () -Methode ausgeführt wird, erhalten Sie die folgende Ausgabe.
New Student (Wasim Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...