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.
Để 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.
Bước 2: Chọn mục 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.tt
và POCODemo.tt
được tạo trong 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.
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ặcprotected
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ứcCreatObject
đượ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ặcIEntityWithRelationships
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ànhtrue
.
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
.