Kiểu thực thể trong Entity Framework

Kiểu thực thể trong Entity Framework

Trong Entity Framework, có hai kiểu thực thể cho phép các nhà phát triển sử dụng các lớp dữ liệu tùy chỉnh của riêng họ cùng với mô hình dữ liệu mà không cần thực hiện bất kỳ sửa đổi nào đối với các lớp dữ liệu.

  • Các thực thể POCO
  • Proxy động

Các thực thể POCO

  • POCO là viết tắt của các đối tượng CLR “cũ” có thể được sử dụng làm đối tượng miền hiện có với mô hình dữ liệu của bạn.
  • Các lớp dữ liệu POCO được ánh xạ tới các thực thể được định nghĩa trong mô hình dữ liệu.
  • Nó cũng hỗ trợ hầu hết các phương thức truy vấn, thêm mới, cập nhật và xóa giống như các kiểu thực thể được tạo bởi các công cụ mô hình dữ liệu thực thể (Entity Data Model).
  • Bạn có thể sử dụng mẫu POCO để tạo các kiểu thực thể không có tính bền vững từ một mô hình khái niệm.

Chúng ta hãy xem ví dụ sau đây về mô hình dữ liệu thực thể khái niệm.

Mô hình dữ liệu thực thể khái niệm trong Entity Framework

Để tạo các thực thể POCO cho mô hình thực thể ở trên:

Bước 1: Nhấp chuột phải vào cửa sổ thiết kế. Nó sẽ hiển thị hộp thoại sau.

Cửa sổ thiết kế mô hình dữ liệu thực thể khái niệm

Bước 2: Chọn mục Add Code Generation Item...

Add code generation item

Bước 3: Chọn EF 6.x DbContext Generator, đặt tên và sau đó nhấp vào nút Add.

Bạn sẽ thấy các mẫu POCODemo.Context.ttPOCODemo.tt được tạo trong solution explorer.

Solution explorer

POCODemo.Context tạo DbContext và các bộ đối tượng mà bạn có thể trả về và sử dụng để truy vấn.

Entity code generator

Sau đây là mã cho lớp Student được tạo tự động từ mô hình thực thể.

namespace ConsoleApplication1 
{
   using System;
   using System.Collections.Generic;

   public partial class Student 
   {
      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2214:DoNotCallOverridableMethodsInConstructors")]
      public Student() 
      {
         this.Enrollments = new HashSet<Enrollment>();
      }

      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public System.DateTime EnrollmentDate { get; set; }

      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", 
         "CA2227:CollectionPropertiesShouldBeReadOnly")]
      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
}

Các lớp tương tự cũng được tạo cho các bảng Course và Enrollment từ mô hình thực thể.

Proxy động

Khi tạo các thể hiện của các kiểu thực thể POCO, Entity Framework thường tạo các thể hiện của kiểu dẫn xuất được tạo động, hoạt động như một proxy cho thực thể.

Cũng có thể nói rằng nó là một lớp proxy khi thực thi giống như một lớp bao bọc của thực thể POCO.

  • Bạn có thể ghi đè một số thuộc tính của thực thể để thực hiện các hành động tự động khi thuộc tính được truy cập.
  • Cơ chế này được sử dụng để hỗ trợ lazy loading các đối tượng liên quan và theo dõi thay đổi tự động.
  • Kỹ thuật này cũng áp dụng cho những mô hình được tạo bằng Code First và EF Designer.

Nếu bạn muốn Entity Framework hỗ trợ lazy loading các đối tượng liên quan và theo dõi các thay đổi trong các lớp POCO, thì các lớp POCO phải đáp ứng các yêu cầu sau:

  • Lớp dữ liệu tùy chỉnh phải được khai báo với quyền truy cập public.
  • Lớp dữ liệu tùy chỉnh không được sealed.
  • Lớp dữ liệu tùy chỉnh không được abstract.
  • Lớp dữ liệu tùy chỉnh phải có một phương thức khởi tạo public hoặc protected không có tham số.
  • Sử dụng một phương thức khởi tạo protected không có tham số nếu bạn muốn phương thức CreatObject được sử dụng để tạo proxy cho thực thể POCO.
  • Gọi phương thức CreatObject không đảm bảo việc tạo proxy: lớp POCO phải tuân theo các yêu cầu khác được mô tả trong chủ đề này.
  • Lớp không được thực hiện các interface IEntityWithChangeTracker hoặc IEntityWithRelationships vì các lớp proxy thực hiện các interface này.
  • Tùy chọn ProxyCreationEnables phải được thiết lập thành true.

Ví dụ sau đây là của lớp thực thể proxy động.

public partial class Course 
{
   public Course() 
   {
      this.Enrollments = new HashSet<Enrollment>();
   }

   public int CourseID { get; set; }
   public string Title { get; set; }
   public int Credits { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

Để vô hiệu hóa việc tạo các đối tượng proxy, thiết lập giá trị của thuộc tính ProxyCreationEnables thành false.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *