I. Những kiểu thực thể trong Entity Framework:

Chúng ta tạo EDM từ CSDL hiện tại trong phần trước. Như bạn đã được học trong phần trước rằng EDM chứa những thực thể cho mỗi bảng trong CSDL. Có hai kiểu thực thể trong Entity Framework 5.0/6.0: POCO entity và dynamic proxy entity

POCO Entity (Plain Old CLR Object):

Lớp POCO là lớp không phụ thuộc vào bất kỳ lớp framework cụ thể nào. Nó giống như bất kỳ lớp .Net thông thường khác đó là tại sao nó được gọi là “Plain Old CLR Objects”.

Những thực thể POCO này (cũng được biết đến như những đối tượng persistence-ignorant) hỗ trợ hâu hết cùng kiểu truy vấn,  những hành vi insert, update, and delete như những kiểu thực thể được khởi tạo bởi Entity Data Model.

public class Student
{
    public Student()
    {
        this.Courses = new List<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    
    public Standard Standard { get; set; }
    public StudentAddress StudentAddress { get; set; }
    public IList<Course> Courses { get; set; }
}

Dynamic Proxy (POCO Proxy):

Dynamic Proxy là một lớp runtime proxy của POCO entity. Nó giống như một lớp bọc phía ngoài của POCO entity. Những thực thể dynamic proxy cho phép lazy loading và automatic change tracking.

POCO entity nên đáp ứng những yêu cầu sau để trở thành một POCO proxy:

  1. Một lớp POCO phải được khai báo với kiểu truy cập public.
  2. Một lớp POCO không phải là sealed (NotInheritable in Visual Basic).
  3. Một lớp POCO không phải là abstract (MustInherit in Visual Basic).
  4. Mỗi thuộc tính điều hướng phải được khai báo như public, virtual.
  5. Mỗi thuộc tính tập hợp phải là ICollection<T>.
  6. ProxyCreationEnabled option không thể false (mặc định là true) trong lớp context.

Thực thể Student POCO sau đáp ứng tất cả những yêu cầu trên để trở thành thực thể dynamic proxy ở thời điểm khởi chạy.

        public class Student
        {
            public Student()
            {
                this.Courses = new HashSet<Course>();
            }
            public int StudentID { get; set; }
            public string StudentName { get; set; }
            public Nullable<int> StandardId { get; set; }
            public virtual Standard Standard { get; set; }
            public virtual StudentAddress StudentAddress { get; set; }
            public virtual ICollection<Course> Courses { get; set; }
        }

Note: Mặc định dynamic proxy là được kích hoạt cho mỗi thực thể. Tuy nhiên bạn có thể vô hiệu hóa dynamic proxy bằng cách cài đặt ProxyCreationEnabled option thành false trong lớp context.

context.Configuration.ProxyCreationEnabled = false;

Mặc định EDM khởi tạo những thực thể POCO đáp ứng được những yêu cầu trên cho một dynamic proxy

Ở thời điểm khởi chạy, kiểu của Student sẽ là System.Data.Entity.DynamicProxies.Student như bên dưới:

dynamic proxy entity in entity framework

Lấy kiểu thực thể thực tế từ một dynamic proxy:

Bạn có thể sử dụng ObjectContext.GetObjectType() để tìm kiểu thực tếcủa dynamic proxy như bên dưới:

dynamic proxy entity in entity framework

Thực thể có hai kiểu thuộc tính, Scalar và Navigation.

Scalar properties:

Thuộc tính Scalar là những thuộc tính mà những giá trị thực tế được chứa đựng trong thực thể. VD: Thực thể Student có những thuộc tính scalar giống như StudentId và StudentName. Những thuộc tính này tương đương với những cột trong bảng Student.

Navigation properties:

Thuộc tính Navigation là những con trỏ tới những thuộc tính liên quan khác. Student có thuộc tính Standard như là thuộc tính navigation và sẽ kích hoạt ứng dụng để điều hướng từ một Student tới  thực thể Standard liên quan.

II. Vòng đời của thực thể:

Trước khi chúng ta là việc với CRUD operation (Create, Read, Update, Delete), nó là quan trọng để hiểu vòng đời của thực thể và EntityFramework quản lý nó như thế nào.

Suốt  vòng đời của một thực thể, mỗi thực thể có một trạng thái thực thể dựa trên hoạt động được thực hiện trên nó qua context (DbContext). Trạng thái thực thể là một enum của kiểu System.Data.Entity.EntityState bao gồm các giá trị sau:

  1. Added
  2. Deleted
  3. Modified
  4. Unchanged
  5. Detached

Context không chỉ giữ những tham chiếu tới tất cả các đối tượng nhận được từ CSDL mà còn giữ những trạng thái thực thể và duy trì những thay đổi tới những thuộc tính của thực thể. Chức năng này được biết như là Change Tracking.

Thay đổi trong trạng thái thực thể từ trạng thái Unchanged thành Modified chỉ là trạng thái được điều khiển tự động bởi context. Tất cả những thay đổi khác phải được thực hiện rõ ràng sử dụng những phương thức thích hợp của DbContext và DbSet.

Hình sau minh họa hoạt động thực hiện thế nào trên những thay đổi trạng thái của thực thể lần lượt ảnh hưởng đến hoạt động của CSDL.

entity states in Entity

Như bạn nhìn thấy ở hình minh họa trên, thực thể mới trong context có trạng thái thực thể Added. Do đó context sẽ thực thi lệnh insert trên CSDL. Cùng một cách khi bạn nhận được một thực thể tồn tại sử dụng truy vấn L2E, nó sẽ có trạng thái thực thể Unchanged, điều này là bởi vì bạn đã vừa nhận được một thực thể và chưa thực hiện bất kỳ hành động trên nó. Khi bạn điều chỉnh giá trị của thực thể tồn tại, nó thay đổi trạng thái thành Modified và sẽ lần lượt thực thi lệnh update trên SaveChanges. Xóa thực thể từ context sẽ có trạng thái Deleted và sẽ lần lượt thực thi lệnh delete trên CSDL.

Vậy theo cách này, những hoạt động thực hiện trên những trạng thái thay đổi của thực thể. Context xây dựng và thực thi lệnh trên CSDL dựa vào trạng thái của một thực thể.

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

Advertisements