Khung thực thể - DbContext

Khung thực thể cho phép bạn truy vấn, chèn, cập nhật và xóa dữ liệu, sử dụng các đối tượng Thời gian chạy ngôn ngữ chung (CLR) được gọi là thực thể. Khung thực thể ánh xạ các thực thể và mối quan hệ được xác định trong mô hình của bạn với cơ sở dữ liệu. Nó cũng cung cấp các tiện nghi để -

  • Vật chất hóa dữ liệu được trả về từ cơ sở dữ liệu dưới dạng các đối tượng thực thể
  • Theo dõi các thay đổi đã được thực hiện đối với các đối tượng
  • Xử lý đồng thời
  • Truyền các thay đổi đối tượng trở lại cơ sở dữ liệu
  • Ràng buộc các đối tượng với điều khiển

Lớp chính chịu trách nhiệm tương tác với dữ liệu dưới dạng các đối tượng là System.Data.Entity.DbContext. DbContext API không được phát hành như một phần của .NET Framework. Để linh hoạt và thường xuyên hơn với việc phát hành các tính năng mới cho Code First và API DbContext, nhóm Entity Framework phân phối EntityFramework.dll thông qua tính năng phân phối NuGet của Microsoft.

  • NuGet cho phép bạn thêm các tham chiếu đến các dự án .NET của mình bằng cách kéo trực tiếp các tệp DLL có liên quan vào dự án của bạn từ Web.

  • Tiện ích mở rộng Visual Studio được gọi là Trình quản lý gói thư viện cung cấp một cách dễ dàng để kéo tập hợp thích hợp từ Web vào các dự án của bạn.

  • API DbContext chủ yếu nhằm mục đích đơn giản hóa tương tác của bạn với Entity Framework.

  • Nó cũng làm giảm số lượng các phương thức và thuộc tính bạn cần để truy cập các tác vụ thường dùng.

  • Trong các phiên bản trước của Entity Framework, các tác vụ này thường phức tạp để khám phá và viết mã.

  • Lớp ngữ cảnh quản lý các đối tượng thực thể trong thời gian chạy, bao gồm điền các đối tượng với dữ liệu từ cơ sở dữ liệu, theo dõi thay đổi và dữ liệu liên tục vào cơ sở dữ liệu.

Định nghĩa một lớp do DbContext tạo ra

Cách được khuyến nghị để làm việc với ngữ cảnh là xác định một lớp dẫn xuất từ ​​DbContext và hiển thị các thuộc tính DbSet đại diện cho các tập hợp của các thực thể được chỉ định trong ngữ cảnh. Nếu bạn đang làm việc với EF Designer, ngữ cảnh sẽ được tạo cho bạn. Nếu bạn đang làm việc với Code First, bạn thường sẽ tự viết ngữ cảnh.

Đoạn mã sau đây là một ví dụ đơn giản cho thấy UniContext có nguồn gốc từ DbContext.

  • Bạn có thể sử dụng các thuộc tính tự động với DbSet như getter và setter.

  • Nó cũng làm cho mã sạch hơn nhiều, nhưng bạn không bắt buộc phải sử dụng nó cho mục đích tạo DbSet khi bạn không có logic nào khác để áp dụng.

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • Trước đây, EDM được sử dụng để tạo các lớp ngữ cảnh có nguồn gốc từ lớp ObjectContext.

  • Làm việc với ObjectContext hơi phức tạp.

  • DbContext là một trình bao bọc xung quanh ObjectContext thực sự tương tự như ObjectContext và rất hữu ích và dễ dàng trong tất cả các mô hình phát triển như Code First, Model First và Database First.

Truy vấn

Có ba loại truy vấn bạn có thể sử dụng, chẳng hạn như -

  • Thêm một thực thể mới.
  • Thay đổi hoặc cập nhật các giá trị thuộc tính của một thực thể hiện có.
  • Xóa một thực thể hiện có.

Thêm thực thể mới

Việc thêm một đối tượng mới với Entity Framework cũng đơn giản như việc xây dựng một phiên bản mới của đối tượng của bạn và đăng ký nó bằng phương pháp Add trên DbSet. Đoạn mã sau dành cho khi bạn muốn thêm một sinh viên mới vào cơ sở dữ liệu.

private static void AddStudent() {

   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();

   }
}

Thay đổi các thực thể hiện có

Thay đổi các đối tượng hiện có chỉ đơn giản như cập nhật giá trị được gán cho (các) thuộc tính bạn muốn thay đổi và gọi SaveChanges. Trong đoạn mã sau, họ của Ali đã được đổi từ Khan thành Aslam.

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

Xóa các đối tượng hiện có

Để xóa một thực thể bằng Entity Framework, bạn sử dụng phương pháp Remove trên DbSet. Xóa tác phẩm cho cả thực thể hiện có và thực thể mới được thêm vào. Gọi Xóa trên một thực thể đã được thêm nhưng chưa được lưu vào cơ sở dữ liệu sẽ hủy bỏ việc thêm đối tượng. Thực thể bị xóa khỏi trình theo dõi thay đổi và không còn được DbContext theo dõi nữa. Việc gọi Xóa trên một thực thể hiện có đang được theo dõi thay đổi sẽ đăng ký thực thể để xóa vào lần gọi SaveChanges tiếp theo. Ví dụ sau đây cho thấy một trường hợp mà sinh viên bị xóa khỏi cơ sở dữ liệu có tên đầu tiên là Ali.

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}