EF 6 - Lưu Entity Graph bị ngắt kết nối
Lưu thực Entity Graph ngắt kết nối trong EF 6
Trong phần trước, chúng ta biết cách lưu một thực thể bị ngắt kết nối. Tại đây, bạn sẽ học cách lưu một biểu đồ thực thể bị ngắt kết nối.
Cập nhật một biểu đồ thực thể trong tình huống bị ngắt kết nối là một nhiệm vụ phức tạp và cần được xem xét thiết kế cẩn thận.
Vấn đề trong việc cập nhật một biểu đồ thực thể bị ngắt kết nối là ngữ cảnh không biết hoạt động nào đã được thực hiện trên nó ở phía máy khách. Theo hình sau, ngữ cảnh mới không biết trạng thái của từng thực thể:
Chúng ta cần xác định các trạng thái của từng thực thể trong biểu đồ thực thể trước khi gọi phương thức SaveChages (). Có các mẫu khác nhau để xác định trạng thái thực thể, mà chúng ta cần xem xét khi thiết kế lớp dữ liệu với Entity Framework. Ở đây chúng ta sẽ sử dụng thuộc tính khóa để xác định trạng thái thực thể.
Sử dụng Thuộc tính khóa chính
Bạn có thể sử dụng thuộc tính khóa (PrimaryKey) của mỗi thực thể để xác định trạng thái của nó. Nếu một giá trị của thuộc tính khóa là giá trị mặc định của kiểu dữ liệu CLR, thì hãy coi nó như một thực thể mới. Nếu không, hãy coi nó là một thực thể hiện có. Ví dụ, nếu kiểu dữ liệu của thuộc tính khóa là int và giá trị của thuộc tính bằng 0, thì đó là thực thể mới. Do đó, EF cần thực hiện lệnh INSERT. Nếu một giá trị khác 0, thì nó là một thực thể hiện có và EF cần thực hiện lệnh UPDATE.
Ví dụ sau minh họa việc lưu biểu đồ thực thể Student với các thực thể Standard và Course
:
var student = new Student() { //Root entity (empty key)
StudentName = "Bill",
Standard = new Standard() //Child entity (with key value)
{
StandardId = 1,
StandardName = "Grade 1"
},
Courses = new List<Course>() {
new Course(){ CourseName = "Machine Language" }, //Child entity (empty key)
new Course(){ CourseId = 2 } //Child entity (with key value)
}
};
using (var context = new SchoolDBEntities())
{
//mark standard based on StandardId
context.Entry(student).State = student.StudentId == 0 ? EntityState.Added : EntityState.Modified;
context.Entry(student.Standard).State = student.Standard.StandardId == 0 ? EntityState.Added : EntityState.Modified;
foreach (var course in student.Courses)
context.Entry(course).State = course.CourseId == 0 ? EntityState.Added : EntityState.Modified;
context.SaveChanges();
}
Trong ví dụ trên, biểu đồ thực thể Student có mối quan hệ với Standard
và Course
. Ngữ cảnh đặt trạng thái thích hợp cho từng thực thể dựa trên giá trị thuộc tính chính. Nếu nó bằng 0, thì nó gán trạng thái Added, còn ngược lại gán trạng Modified . Phương thức SaveChanges () sẽ thực thi lệnh INSERT hoặc UPDATE thích hợp cho cơ sở dữ liệu cho từng thực thể.