Khung thực thể - Các thực thể bị ngắt kết nối
Trong chương này, chúng ta hãy xem cách thực hiện thay đổi đối với các thực thể không được theo dõi bởi ngữ cảnh. Các thực thể không được ngữ cảnh theo dõi được gọi là các thực thể 'bị ngắt kết nối'.
Đối với hầu hết các ứng dụng một lớp, nơi giao diện người dùng và các lớp truy cập cơ sở dữ liệu chạy trong cùng một quy trình ứng dụng, bạn có thể sẽ chỉ thực hiện các thao tác trên các thực thể đang được theo dõi bởi ngữ cảnh.
Các hoạt động trên các thực thể bị ngắt kết nối phổ biến hơn nhiều trong các ứng dụng N-Tier.
Ứng dụng N-Tier liên quan đến việc tìm nạp một số dữ liệu trên máy chủ và trả lại dữ liệu đó qua mạng cho máy khách.
Sau đó, ứng dụng khách sẽ thao tác dữ liệu này trước khi đưa nó trở lại máy chủ.
Sau đây là hai bước cần được thực hiện với biểu đồ thực thể bị ngắt kết nối hoặc thậm chí một thực thể bị ngắt kết nối.
Gắn các thực thể với phiên bản ngữ cảnh mới và làm cho ngữ cảnh nhận biết về các thực thể này.
Đặt các Thực thể thích hợp cho các thực thể này theo cách thủ công.
Hãy xem đoạn mã sau, trong đó thực thể Sinh viên được thêm vào với hai thực thể Ghi danh.
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();
}
}
}
Mã xây dựng một cá thể Sinh viên mới, nó cũng tham chiếu đến hai cá thể Đăng ký mới trong thuộc tính Đăng ký của nó.
Sau đó, Sinh viên mới được thêm vào ngữ cảnh bằng phương pháp Thêm.
Sau khi Sinh viên được thêm, mã sử dụng phương thức DbContext.Entry để có quyền truy cập vào thông tin theo dõi thay đổi mà Entity Framework có về Sinh viên mới.
Từ thông tin theo dõi thay đổi này, thuộc tính State được sử dụng để viết trạng thái hiện tại của thực thể.
Sau đó, quá trình này được lặp lại cho mỗi Đăng ký mới được tạo được tham chiếu từ Học sinh mới. Nếu bạn chạy ứng dụng, bạn sẽ nhận được kết quả sau:
New Student (Wasim Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...
Trong khi DbSet.Add được sử dụng để thông báo cho Entity Framework về các thực thể mới, thì DbSet.Attach được sử dụng để thông báo cho Entity Framework về các thực thể hiện có. Phương thức Đính kèm sẽ đánh dấu một thực thể ở trạng thái Không thay đổi.
Hãy xem đoạn mã C # sau, trong đó một thực thể bị ngắt kết nối được đính kèm với 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();
}
}
}
Khi đoạn mã trên được thực thi bằng phương thức Attach (), bạn sẽ nhận được kết quả sau.
New Student (Wasim Akram): Unchanged
Enrollment ID: 2001 State: Unchanged
Enrollment ID: 2002 State: Unchanged
Press any key to exit...