Khung thực thể - Tính bền bỉ
Khung thực thể hiện cho phép bạn hưởng lợi từ Khung thực thể mà không buộc mọi phần trong ứng dụng của bạn phải nhận thức được Khung thực thể, tách các thực thể khỏi cơ sở hạ tầng. Bạn có thể tạo các lớp có thể tập trung vào các quy tắc kinh doanh của chúng mà không cần quan tâm đến việc chúng được tồn tại như thế nào (nơi dữ liệu được lưu trữ và cách dữ liệu qua lại giữa các đối tượng của bạn).
Tạo đối tượng thiếu hiểu biết liên tục
Đoạn trước đã mô tả một phương pháp không có kiến thức sâu sắc về nguồn dữ liệu mà nó sử dụng. Điều này làm nổi bật bản chất của sự thiếu hiểu biết về tính bền bỉ, đó là khi các lớp của bạn và nhiều lớp ứng dụng của chúng tôi xung quanh chúng không quan tâm đến cách dữ liệu được lưu trữ.
Trong phiên bản .NET 3.5 của Entity Framework, nếu bạn muốn sử dụng các lớp có sẵn, bạn bắt buộc phải sửa đổi chúng bằng cách buộc chúng phải dẫn xuất từ EntityObject.
Trong .NET 4, điều này không còn cần thiết nữa. Bạn không phải sửa đổi các thực thể của mình để chúng tham gia vào các hoạt động của Khung thực thể.
Điều này cho phép chúng tôi xây dựng các ứng dụng bao gồm khớp nối lỏng lẻo và tách biệt các mối quan tâm.
Với các mẫu mã này, các lớp của bạn chỉ quan tâm đến các công việc của riêng chúng và nhiều lớp trong ứng dụng của bạn, bao gồm cả giao diện người dùng, không có sự phụ thuộc vào logic bên ngoài, chẳng hạn như các API của Entity Framework, nhưng các API bên ngoài đó có thể tương tác với các thực thể.
Có 2 cách (kết nối và ngắt kết nối) khi duy trì một thực thể với Khung thực thể. Cả hai cách đều có tầm quan trọng riêng. Trong trường hợp kịch bản được kết nối, các thay đổi được theo dõi bởi ngữ cảnh nhưng trong trường hợp kịch bản bị ngắt kết nối, chúng ta cần thông báo cho ngữ cảnh về trạng thái của thực thể.
Các tình huống được kết nối
Kịch bản được kết nối là khi một thực thể được truy xuất từ cơ sở dữ liệu và được sửa đổi trong cùng một ngữ cảnh. Đối với tình huống được kết nối, hãy giả sử chúng ta có một dịch vụ Windows và chúng ta đang thực hiện một số hoạt động kinh doanh với thực thể đó, vì vậy chúng tôi sẽ mở ngữ cảnh, lặp qua tất cả các thực thể, thực hiện các hoạt động kinh doanh của chúng tôi và sau đó lưu các thay đổi với cùng ngữ cảnh mà chúng tôi mở đầu.
Hãy xem ví dụ sau, trong đó học sinh được truy xuất từ cơ sở dữ liệu và cập nhật tên của học sinh, sau đó lưu các thay đổi vào cơ sở dữ liệu.
class Program {
static void Main(string[] args) {
using (var context = new MyContext()) {
var studentList = context.Students.ToList();
foreach (var stdnt in studentList) {
stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
}
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau và bạn sẽ thấy từ Đã chỉnh sửa được đính kèm trước tên đầu tiên như được hiển thị trong kết quả sau.
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Mark Upston
Các tình huống bị ngắt kết nối
Kịch bản ngắt kết nối là khi một thực thể được truy xuất từ cơ sở dữ liệu và được sửa đổi trong ngữ cảnh khác. Giả sử chúng ta muốn hiển thị một số dữ liệu trong Lớp trình bày và chúng ta đang sử dụng một số ứng dụng n-tier, vì vậy sẽ tốt hơn nếu mở ngữ cảnh, tìm nạp dữ liệu và cuối cùng đóng ngữ cảnh. Vì ở đây chúng tôi đã tìm nạp dữ liệu và đóng ngữ cảnh, các thực thể mà chúng tôi đã tìm nạp không còn được theo dõi nữa và đây là tình huống bị ngắt kết nối.
Hãy xem đoạn mã sau, trong đó thực thể Sinh viên bị ngắt kết nối mới được thêm vào ngữ cảnh bằng phương thức Thêm.
class Program {
static void Main(string[] args) {
var student = new Student {
ID = 1001,
FirstMidName = "Wasim",
LastName = "Akram",
EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
};
using (var context = new MyContext()) {
context.Students.Add(student);
context.SaveChanges();
//// Display all Students from the database
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList<Student>();
Console.WriteLine("Retrieve all Students from the database:");
foreach (var stdnt in students) {
string name = stdnt.FirstMidName + " " + stdnt.LastName;
Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
}
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.
Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram