Khung thực thể - Vòng đời

Cả đời

Thời gian tồn tại của ngữ cảnh bắt đầu khi cá thể được tạo và kết thúc khi cá thể đó được xử lý hoặc thu gom rác.

  • Thời gian tồn tại theo ngữ cảnh là một quyết định rất quan trọng khi chúng ta sử dụng ORM.

  • Bối cảnh đang hoạt động giống như một bộ đệm thực thể, vì vậy nó có nghĩa là nó chứa các tham chiếu đến tất cả các thực thể được tải, có thể phát triển rất nhanh trong việc tiêu thụ bộ nhớ và nó cũng có thể gây rò rỉ bộ nhớ.

  • Trong sơ đồ bên dưới, bạn có thể thấy quy trình làm việc dữ liệu cấp trên từ ứng dụng đến cơ sở dữ liệu thông qua Ngữ cảnh và ngược lại.

Vòng đời thực thể

Vòng đời Thực thể mô tả quá trình trong đó Thực thể được tạo, thêm, sửa đổi, xóa, v.v. Thực thể có nhiều trạng thái trong suốt thời gian tồn tại của nó. Trước khi xem cách truy xuất trạng thái thực thể, chúng ta hãy xem trạng thái thực thể là gì. Trạng thái là một kiểu enumSystem.Data.EntityState khai báo các giá trị sau:

  • Added: Thực thể được đánh dấu là đã thêm.

  • Deleted: Thực thể được đánh dấu là đã xóa.

  • Modified: Thực thể đã được sửa đổi.

  • Unchanged: Thực thể chưa được sửa đổi.

  • Detached: Thực thể không được theo dõi.

Thay đổi trạng thái trong vòng đời thực thể

Đôi khi trạng thái của các thực thể được đặt tự động bởi ngữ cảnh, nhưng nó cũng có thể được nhà phát triển sửa đổi theo cách thủ công. Mặc dù tất cả các kết hợp chuyển đổi từ trạng thái này sang trạng thái khác đều có thể thực hiện được, nhưng một số trong số chúng là vô nghĩa. Ví dụ,Added thực thể cho Deleted trạng thái, hoặc ngược lại.

Hãy thảo luận về các trạng thái khác nhau.

Trạng thái không thay đổi

  • Khi một thực thể là Không thay đổi, nó bị ràng buộc với ngữ cảnh nhưng nó chưa được sửa đổi.

  • Theo mặc định, một thực thể được truy xuất từ ​​cơ sở dữ liệu ở trạng thái này.

  • Khi một thực thể được gắn vào ngữ cảnh (với phương thức Đính kèm), nó tương tự ở trạng thái Không thay đổi.

  • Ngữ cảnh không thể theo dõi các thay đổi đối với các đối tượng mà nó không tham chiếu, vì vậy khi chúng được đính kèm, nó sẽ giả định rằng chúng Không thay đổi.

Trạng thái tách biệt

  • Tách rời là trạng thái mặc định của một thực thể mới được tạo vì ngữ cảnh không thể theo dõi việc tạo bất kỳ đối tượng nào trong mã của bạn.

  • Điều này đúng ngay cả khi bạn khởi tạo thực thể bên trong một khối sử dụng ngữ cảnh.

  • Tách rời thậm chí là trạng thái của các thực thể được truy xuất từ ​​cơ sở dữ liệu khi tính năng theo dõi bị vô hiệu hóa.

  • Khi một thực thể được tách ra, nó không bị ràng buộc với ngữ cảnh, vì vậy trạng thái của nó không được theo dõi.

  • Nó có thể được xử lý, sửa đổi, sử dụng kết hợp với các lớp khác hoặc sử dụng theo bất kỳ cách nào khác mà bạn có thể cần.

  • Bởi vì không có ngữ cảnh theo dõi nó, nó không có ý nghĩa gì đối với Entity Framework.

Đã thêm trạng thái

  • Khi một thực thể ở trạng thái Đã thêm, bạn có một số tùy chọn. Trên thực tế, bạn chỉ có thể tách nó ra khỏi ngữ cảnh.

  • Đương nhiên, ngay cả khi bạn sửa đổi một số thuộc tính, trạng thái vẫn được Thêm vào, bởi vì việc chuyển nó thành Đã sửa đổi, Không thay đổi hoặc Đã xóa không có ý nghĩa gì.

  • Đó là một thực thể mới và không có sự tương ứng với một hàng trong cơ sở dữ liệu.

  • Đây là điều kiện tiên quyết cơ bản để ở một trong những trạng thái đó (nhưng quy tắc này không được thực thi theo ngữ cảnh).

Trạng thái sửa đổi

  • Khi một thực thể được sửa đổi, điều đó có nghĩa là nó ở trạng thái Không thay đổi và sau đó một số thuộc tính đã được thay đổi.

  • Sau khi một thực thể chuyển sang trạng thái Đã sửa đổi, nó có thể chuyển sang trạng thái Đã tách hoặc Đã xóa, nhưng không thể quay trở lại trạng thái Không thay đổi ngay cả khi bạn khôi phục các giá trị ban đầu theo cách thủ công.

  • Nó thậm chí không thể được thay đổi thành Đã thêm, trừ khi bạn tách và thêm thực thể vào ngữ cảnh, bởi vì một hàng có ID này đã tồn tại trong cơ sở dữ liệu và bạn sẽ nhận được ngoại lệ thời gian chạy khi duy trì nó.

Trạng thái đã xóa

  • Một thực thể đi vào trạng thái Đã xóa vì nó không được thay đổi hoặc sửa đổi và sau đó phương pháp DeleteObject được sử dụng.

  • Đây là trạng thái hạn chế nhất, vì nó vô nghĩa thay đổi từ trạng thái này sang bất kỳ giá trị nào khác nhưng tách rời.

Các usingnếu bạn muốn tất cả các tài nguyên mà ngữ cảnh kiểm soát được xử lý ở cuối khối. Khi bạn sử dụngusing câu lệnh, sau đó trình biên dịch tự động tạo một khối thử / cuối cùng và các lệnh gọi vứt bỏ trong khối cuối cùng.

using (var context = new UniContext()) {

   var student = new Student {
      LastName = "Khan", 
      FirstMidName = "Ali", 
      EnrollmentDate = DateTime.Parse("2005-09-01")
   };

   context.Students.Add(student);
   context.SaveChanges();
}

Khi làm việc với ngữ cảnh dài hạn, hãy xem xét những điều sau:

  • Khi bạn tải nhiều đối tượng hơn và các tham chiếu của chúng vào bộ nhớ, mức tiêu thụ bộ nhớ của ngữ cảnh có thể tăng lên nhanh chóng. Điều này có thể gây ra các vấn đề về hiệu suất.

  • Hãy nhớ loại bỏ ngữ cảnh khi nó không còn được yêu cầu.

  • Nếu một ngoại lệ khiến ngữ cảnh ở trạng thái không thể khôi phục, toàn bộ ứng dụng có thể chấm dứt.

  • Cơ hội gặp phải các vấn đề liên quan đến đồng thời tăng lên khi khoảng cách giữa thời gian dữ liệu được truy vấn và cập nhật tăng lên.

  • Khi làm việc với các ứng dụng Web, hãy sử dụng một phiên bản ngữ cảnh cho mỗi yêu cầu.

  • Khi làm việc với Windows Presentation Foundation (WPF) hoặc Windows Forms, hãy sử dụng một phiên bản ngữ cảnh cho mỗi biểu mẫu. Điều này cho phép bạn sử dụng chức năng theo dõi thay đổi mà ngữ cảnh cung cấp.

Quy tắc của ngón tay cái

Web Applications

  • Hiện nay, một phương pháp phổ biến và tốt nhất là đối với các ứng dụng web, ngữ cảnh được sử dụng theo yêu cầu.

  • Trong các ứng dụng web, chúng tôi xử lý các yêu cầu rất ngắn nhưng giữ tất cả các giao dịch máy chủ, do đó, chúng là khoảng thời gian thích hợp cho bối cảnh tồn tại.

Desktop Applications

  • Đối với ứng dụng dành cho máy tính để bàn, như Win Forms / WPF, v.v., ngữ cảnh được sử dụng cho mỗi biểu mẫu / hộp thoại / trang.

  • Vì chúng tôi không muốn có ngữ cảnh như một singleton cho ứng dụng của mình, chúng tôi sẽ loại bỏ nó khi chúng tôi chuyển từ dạng này sang dạng khác.

  • Bằng cách này, chúng ta sẽ đạt được rất nhiều khả năng của bối cảnh và không bị ảnh hưởng bởi các bối cảnh dài hạn.