Disconnected Entities:

Phần trước chúng ta đã thấy làm thế nào để thực hiện thao tác CRUD trên disconnected entity graph, chúng ta hãy xem làm thế nào để liên kết disconnected entity graph với thể hiện mới của context.

Có hai thứ chúng ta cần làm khi lấy về một disconnected entity graph hoặc thậm chí một thực thể disconnected đơn. Đầu tiên chúng ta cần gắn những thực thể với context instance mới và làm cho context nhận biết về những thực thể này. Thứ hai cài đặt EntityStates thích hợp với những thực thể bằng tay bởi vì context instance mới không biết bất cứ điều gì về những thao tác đã thực hiện trên những thực thể disconnected vì vậy context mới không thể áp dụng EntityState thích hợp.

Hình sau minh họa cho tiến trình này.

attach disconnected entity graph

Entity Framework API cung cấp những phương thức quan trọng để gắn những thực thể disconnected tới context mới và cài đặt EntityStates tới tất cả những thực thể của một entity graph.

DbSet.Add():

Phương thức DbSet.Add() gắn toàn bộ entity graph tới context mới và tự động áp dụng Added entity state tới tất cả những thực thể.

Xem xét đoạn mã sau.

    //disconnected entity graph
    Student disconnectedStudent = new Student() { StudentName = "New Student" };
    disconnectedStudent.StudentAddress = new StudentAddress() { Address1 = "Address", City = "City1" };

    using (var ctx = new SchoolDBEntities())
    {
        //add disconnected Student entity graph to new context instance - ctx
        ctx.Students.Add(disconnectedStudent);
                
        // get DbEntityEntry instance to check the EntityState of specified entity
        var studentEntry = ctx.Entry(disconnectedStudent);
        var addressEntry = ctx.Entry(disconnectedStudent.StudentAddress);

        Console.WriteLine("Student EntityState: {0}",studentEntry.State);

        Console.WriteLine("StudentAddress EntityState: {0}",addressEntry.State);
    }
Output:

Student EntityState: Added
StudentAddress EntityState: Added

Như đoạn mã mẫu trên đây, chúng ta thêm disconnectedStudent entity graph sử dụng phương thức ctx.Students.Add. Ở đây thực thể cha là Student vì vậy chúng ta đã thêm toàn bộ entity graph trong Students DbSet. Chúng ta rồi sau đó nhận thể hiện của DbEntityEntry cho những thực thể Student và StudentAddress để kiểm tra trạng thái của mỗi thực thể. Như bạn thấy trong phần output cả hai thực thể có trạng thái Added.

Như vậy sử dụng phương thức Add của thực thể cha DbSet để gắn toàn bộ entity graph tới context instance mới với trạng thái Added cho mỗi thực thể. Phương thức này sẽ thực thi lệnh insert cho tất cả những thực thể và sẽ insert những dòng mới trong những bảng CSDL thích hợp.

DbSet.Attach():

Phương thức DbSet.Attach gắn toàn bộ entity graph tới context mới với trạng thái thực thể Unchanged.

Xem xét đoạn mã sau.

    
    //disconnected entity graph
    Student disconnectedStudent = new Student() { StudentName = "New Student" };
    disconnectedStudent.StudentAddress = new StudentAddress() { Address1 = "Address", City = "City1" };

    using (var ctx = new SchoolDBEntities())
    {
        //attach disconnected Student entity graph to new context instance - ctx
        ctx.Students.Attach(disconnectedStudent);
                
        // get DbEntityEntry instance to check the EntityState of specified entity
        var studentEntry = ctx.Entry(disconnectedStudent);
        var addressEntry = ctx.Entry(disconnectedStudent.StudentAddress);

        Console.WriteLine("Student EntityState: {0}",studentEntry.State);

        Console.WriteLine("StudentAddress EntityState: {0}",addressEntry.State);
    }
Output:

Student EntityState: Unchanged
StudentAddress EntityState: Unchanged

Như đoạn mã ở trên chúng ta có thể gắn disconnected entity graph sử dụng phương thức DbSet.Attach. Điều này sẽ gắn toàn bộ entity graph tới context mới với trạng thái thực thể Unchanged tới tất cả những thực thể.

Như vậy phương thức Attach sẽ chỉ gắn entity graph tới context vì vậy chúng ta cần tìm trạng thái thực thể thích hợp cho mỗi thực thể và áp dụng nó thủ công.

DbContext.Entry():

Phương thức Entry of DbContext trả về thể hiện của DbEntityEntry cho một thực thể cụ thể. DbEntityEntry có thể sử dụng để thay đổi trạng thái của một thực thể.

DbContext.Entry(disconnectedEntity).state = EntityState.Added/Modified/Deleted/Unchanged

Phương thức này gắn toàn bộ entity graph tới context với trạng thái cụ thể tới thực thể cha và cài đặt trạng thái của những thực thể khác như trình bày trong bảng sau.

Parent Entity State Entity State of child entities
Added Added
Modified Unchanged
Deleted Tất cả thực thể con sẽ là null

Nguồn: http://www.entityframeworktutorial.net/

Advertisements