EF Core - Làm việc với Đồ thị thực thể bị ngắt kết nối trong EF Core
Làm việc với Đồ thị thực thể bị ngắt kết nối trong EF Core
Trong phần trước, chúng đã biết cách ChangeTracker tự động thay đổi EntityState của mỗi thực thể được kết nối. Trong phần này, bạn sẽ tìm hiểu về các hành vi của các phương thức khác nhau trên thực thể gốc và thực thể con của biểu đồ thực thể bị ngắt kết nối trong Entity Framework Core.
Entity Framework Core cung cấp các phương pháp khác nhau sau đây, không chỉ gắn một thực thể vào context (ngữ cảnh) mà còn thay đổi trạng thái EntityState của mỗi thực thể trong một biểu đồ thực thể bị ngắt kết nối:
- Attach()
- Entry()
- Add()
- Update()
- Remove()
Hãy xem cách các phương pháp trên thay đổi EntityState của mỗi thực thể trong một biểu đồ thực thể trong Entity Framework Core 2.x.
Attach()
Các phương thức DbContext.Attach() và DbSet.Attach() được kèm biểu đồ thực thể bị ngắt kết nối . Chúng trả về một thể hiện của EntityEntry, được dùng để gán EntityState thích hợp.
Ví dụ sau minh họa hành vi của phương thức DbContext.Attach() trên EntityState của mỗi thực thể trong một biểu đồ.
public static void Main()
{
var stud = new Student() { //Root entity (empty key)
Name = "Bill",
Address = new StudentAddress() //Child entity (with key value)
{
StudentAddressId = 1,
City = "Seattle",
Country = "USA"
},
StudentCourses = new List<StudentCourse>() {
new StudentCourse(){ Course = new Course(){ CourseName = "Machine Language" } },//Child entity (empty key)
new StudentCourse(){ Course = new Course(){ CourseId = 2 } } //Child entity (with key value)
}
};
var context = new SchoolContext();
context.Attach(stud).State = EntityState.Added;
DisplayStates(context.ChangeTracker.Entries());
}
private static void DisplayStates(IEnumerable<EntityEntry> entries)
{
foreach (var entry in entries)
{
Console.WriteLine($"Entity: {entry.Entity.GetType().Name},
State: {entry.State.ToString()} ");
}
}
Kết quả:
Entity: Student, State: Added
Entity: StudentAddress, State: Unchanged
Entity: StudentCourse, State: Added
Entity: Course, State: Added
Entity: StudentCourse, State: Added
Entity: Course, State: Unchanged
Trong ví dụ trên, stud là một thể hiện của biểu đồ thực thể Student bao gồm các tham chiếu của các thực thể StudentAddress và StudentCourse. context.Attach (stud) .State = EntityState.Added đính kèm biểu đồ thực thể stud vào một ngữ cảnh và gắntrạng thái Added.
Phương thức Attach () gán Added EntityState
vào thực thể gốc (trong trường hợp này là Student
) bất kể nó có chứa giá trị Khóa hay không. Nếu một thực thể con chứa giá trị khóa, thì nó sẽ được đánh dấu là Không thay đổi, nếu không nó sẽ được đánh dấu là Added. Kết quả của ví dụ trên cho thấy thực thể Student
có Added EntityState
, các thực thể con có giá trị khóa không rỗng có Unchanged EntityState
và những thực thể có giá trị khóa trống có trạng thái Added.
Bảng sau liệt kê hành vi của phương thức Attach () khi gán một EntityState khác vào một biểu đồ thực thể bị ngắt kết nối.
Attach() | Root entity with Key value | Root Entity with Empty or CLR default value | Child Entity with Key value | Child Entity with empty or CLR default value |
---|---|---|---|---|
context.Attach(entityGraph).State = EntityState.Added | Added | Added | Unchanged | Added |
context.Attach(entityGraph).State = EntityState.Modified | Modified | Exception | Unchanged | Added |
context.Attach(entityGraph).State = EntityState.Deleted | Deleted | Exception | Unchanged | Added |