Khung thực thể - Theo dõi thay đổi

Entity Framework cung cấp khả năng theo dõi các thay đổi được thực hiện đối với các thực thể và mối quan hệ của chúng, do đó, các bản cập nhật chính xác được thực hiện trên cơ sở dữ liệu khi phương thức SaveChanges của ngữ cảnh được gọi. Đây là một tính năng chính của Khung thực thể.

  • Theo dõi thay đổi theo dõi các thay đổi trong khi thêm (các) bản ghi mới vào tập hợp thực thể, sửa đổi hoặc xóa các thực thể hiện có.

  • Sau đó, tất cả các thay đổi được giữ bởi mức DbContext.

  • Những thay đổi theo dõi này sẽ bị mất nếu chúng không được lưu trước khi đối tượng DbContext bị phá hủy.

  • Lớp DbChangeTracker cung cấp cho bạn tất cả thông tin về các thực thể hiện tại đang được theo dõi bởi ngữ cảnh.

  • Để theo dõi bất kỳ thực thể nào theo ngữ cảnh, nó phải có thuộc tính khóa chính.

Trong Khung thực thể, theo dõi thay đổi được bật theo mặc định. Bạn cũng có thể tắt theo dõi thay đổi bằng cách đặt thuộc tính AutoDetectChangesEnabled của DbContext thành false. Nếu thuộc tính này được đặt thành true thì Khung thực thể duy trì trạng thái của các thực thể.

using (var context = new UniContextEntities()) {
   context.Configuration.AutoDetectChangesEnabled = true;
}

Hãy xem ví dụ sau, trong đó các sinh viên và đăng ký của họ được truy xuất từ ​​cơ sở dữ liệu.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Configuration.AutoDetectChangesEnabled = true;
         Console.WriteLine("Retrieve Student");

         var student = (from s in context.Students where s.FirstMidName == 
            "Ali" select s).FirstOrDefault<Student>();

         string name = student.FirstMidName + " " + student.LastName;
         Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
         Console.WriteLine();
         Console.WriteLine("Retrieve all related enrollments");

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0}, Course ID: {1}", 
               enrollment.EnrollmentID, enrollment.CourseID);
         }

         Console.WriteLine();

         Console.WriteLine("Context tracking changes of {0} entity.", 
            context.ChangeTracker.Entries().Count());

         var entries = context.ChangeTracker.Entries();

         foreach (var entry in entries) {
            Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().Name);
            Console.WriteLine("Status: {0}", entry.State);
         }

         Console.ReadKey();
      }
   }
}

Khi ví dụ trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.

Retrieve Student 
ID: 1, Name: Ali Alexander
Retrieve all related enrollments
       Enrollment ID: 1, Course ID: 1050
       Enrollment ID: 2, Course ID: 4022
       Enrollment ID: 3, Course ID: 4041
Context tracking changes of 4 entity.
Entity Name: Student
Status: Unchanged
Entity Name: Enrollment
Status: Unchanged
Entity Name: Enrollment
Status: Unchanged
Entity Name: Enrollment
Status: Unchanged

Bạn có thể thấy rằng tất cả dữ liệu chỉ được truy xuất từ ​​cơ sở dữ liệu, đó là lý do tại sao trạng thái không thay đổi đối với tất cả các thực thể.

Bây giờ chúng ta hãy xem một ví dụ đơn giản khác, trong đó chúng ta sẽ thêm một đăng ký nữa và xóa một học sinh khỏi cơ sở dữ liệu. Sau đây là mã ghi danh mới được thêm vào và xóa một học sinh.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Configuration.AutoDetectChangesEnabled = true;

         Enrollment enr = new Enrollment() { 
            StudentID = 1, CourseID = 3141 
         };

         Console.WriteLine("Adding New Enrollment");
         context.Enrollments.Add(enr);
         Console.WriteLine("Delete Student");

         var student = (from s in context.Students where s.ID == 
            23 select s).SingleOrDefault<Student>();

         context.Students.Remove(student);
         Console.WriteLine("");

         Console.WriteLine("Context tracking changes of {0} entity.", 
            context.ChangeTracker.Entries().Count());
         var entries = context.ChangeTracker.Entries();

         foreach (var entry in entries) {
            Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().Name);
            Console.WriteLine("Status: {0}", entry.State);
         }

         Console.ReadKey();
      }
   }
}

Khi ví dụ trên được biên dịch và thực thi, bạn sẽ nhận được kết quả sau.

Adding New Enrollment
Delete Student
Context tracking changes of 2 entity.
Entity Name: Enrollment
Status: Added
Entity Name: Student
Status: Deleted

Bây giờ bạn có thể thấy rằng trạng thái của đối tượng đăng ký được đặt thành đã thêm và trạng thái của đối tượng sinh viên bị xóa, vì đăng ký mới đã được thêm vào và một học sinh bị xóa khỏi cơ sở dữ liệu.

Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.