Khung thực thể - Loại
Trong Entity Framework, có hai loại 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 chính các lớp dữ liệu.
- Thực thể POCO
- Proxy động
Thực thể POCO
POCO là viết tắt của các đối tượng CLR "cũ kỹ" có thể được sử dụng như các đố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ột mô hình dữ liệu.
Nó cũng hỗ trợ hầu hết các hành vi truy vấn, chèn, cập nhật và xóa giống như các loại thực thể được tạo bởi các công cụ Mô hình dữ liệu thực thể.
Bạn có thể sử dụng mẫu POCO để tạo các loại thực thể không biết tồn tại từ một mô hình khái niệm.
Chúng ta hãy xem ví dụ sau 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 -
Step 1- Nhấp chuột phải vào cửa sổ trình thiết kế. Nó sẽ hiển thị hộp thoại sau.
Step 2 - Chọn mục Thêm mã tạo mã ...
Step 3 - Chọn EF 6.x DbContext Generator, viết tên và sau đó nhấp vào nút Thêm.
Bạn sẽ thấy trong trình khám phá giải pháp của mình rằng các mẫu POCODemo.Context.tt và POCODemo.tt được tạo.
POCODemo.Context tạo DbContext và các tập đối tượng mà bạn có thể trả về và sử dụng để truy vấn, chẳng hạn như cho ngữ cảnh, Sinh viên và Khóa học, v.v.
Mẫu khác đề cập đến tất cả các loại Sinh viên, Khóa học, v.v. Sau đây là mã cho lớp Sinh viên đượ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 tạo cho các bảng Khóa học và Ghi danh từ Mô hình Thực thể.
Proxy động
Khi tạo các phiên bản của loại thực thể POCO, Khung thực thể thường tạo các phiên bản của loại dẫn xuất được tạo động hoạt động như một proxy cho thực thể. CNTT cũng có thể nói rằng nó là một lớp proxy thời gian chạy giống như một lớp trình 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ợ tải chậm các mối quan hệ 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 Khung thực thể hỗ trợ tải chậm 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 công khai.
Lớp dữ liệu tùy chỉnh không được niêm phong.
Lớp dữ liệu tùy chỉnh không được trừu tượng.
Lớp dữ liệu tùy chỉnh phải có một phương thức khởi tạo công khai hoặc được bảo vệ không có tham số.
Sử dụng một phương thức khởi tạo được bảo vệ không có tham số nếu bạn muốn phương thức CreateObject được sử dụng để tạo proxy cho thực thể POCO.
Việc gọi phương thức CreateObject 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 thể triển khai các giao diện IEntityWithChangeTracker hoặc IEntityWithRelationships vì các lớp proxy thực thi các giao diện này.
Tùy chọn ProxyCreationEnabled phải được đặt thành true.
Ví dụ sau là về 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; }
}
Để tắt tạo đối tượng proxy, hãy đặt giá trị của thuộc tính ProxyCreationEnabled thành false.