DbContext trong Entity Framework

Entity Framework cho phép bạn truy vấn, thêm mới, cập nhật và xóa dữ liệu, sử dụng các đối tượng Common Language Runtime (CLR) được gọi là các thực thể. Entity Framework ánh xạ các thực thể và các mối quan hệ được xác định trong mô hình của bạn vào cơ sở dữ liệu. Nó cũng cung cấp các cơ sở để:

  • Cụ thể 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 những thay đổi được thực hiện cho các đối tượng.
  • Xử lý đồng thời.
  • Cập nhật các thay đổi của đối tượng trở lại cơ sở dữ liệu
  • Ràng buộc các đối tượng với trình đ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 đố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. Để phát hành linh hoạt và thường xuyên hơn các tính năng mới cho Code First và DbContext API.

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 các DLL có liên quan trực tiếp vào dự án của bạn từ Web.
  • Một tiện ích mở rộng Visual Studio có tên là Trình quản lý gói thư viện cung cấp một cách dễ dàng để kéo các thư viện thích hợp từ Web vào các dự án của bạn.
Trình quản lý gói NuGet của Microsoft
  • DbContext API chủ yếu nhắm mục tiêu đơn giản hóa sự tương tác của bạn với Entity Framework.
  • Nó cũng làm giảm số lượng phương thức và thuộc tính bạn cần để truy cập các tác vụ thường được sử 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 để tìm kiếm và viết code.
  • Lớp DbContext quản lý các đối tượng thực thể trong thời gian thực thi, bao gồm các đối tượng lưu trữ dữ liệu từ cơ sở dữ liệu, theo dõi thay đổi và lưu giữ dữ liệu vào cơ sở dữ liệu.

Định nghĩa lớp dẫn xuất DbContext

Cách được đề xuất để làm việc với Context là định nghĩa một lớp dẫn xuất từ lớp DbContext và tạo các thuộc tính DbSet đại diện cho các bộ sưu tập của các thực thể được chỉ định trong Context.

Nếu bạn đang làm việc với Entity Framework Designer (Database First), Context sẽ được tạo cho bạn. Nếu bạn đang làm việc với Code First, bạn sẽ thường tự tạo Context.

Đoạn mã sau đây là một ví dụ đơn giản cho thấy UniContext được dẫn xuất từ DbContext.

  • Bạn có thể sử dụng các thuộc tính tự động với DbSet.
  • Thuộc tính tự động cũng làm cho mã gọn gàng và sạch sẽ. 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 áp dụng logic nào khác.
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 Context được dẫn xuất 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, nó thực sự giống với ObjectContext, rất hữu ích và rất dễ dàng trong tất cả các mô hình phát triển như Code First, Model First và Database First.

Các loại truy vấn trong Entity Framework

Có bốn 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.
  • Cập nhật một thực thể hiện có.
  • Xóa một thực thể hiện có.
  • Xem thông tin của thực thể.

Thêm thực thể mới

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 thể hiện mới của đối tượng của bạn và đăng ký nó bằng phương thức Add trên DbSet. Đoạn mã sau dành cho khi bạn muốn thêm một Student 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("2020-04-01") 
      };

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

Cập nhật thực thể

Cập nhật các đối tượng hiện có cũng đơ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, LastName của Ali đã được đổi từ Khan thành Aslam.

private static void ChangeStudent() 
{
  using (var context = new UniContext()) 
  {
	 var student = (from d in context.Students
					where d.FirstMidName == "Ali" 
					select d).FirstOrDefault();
					
	 student.LastName = "Aslam";
	 context.SaveChanges();
  }
}

Xóa các thực thể

Để xóa một thực thể bằng Entity Framework, bạn sử dụng phương thức Remove trên DbSet. Phương thức Remove có thể làm việc trên các thực thể hiện có và cả những thực thể mới được thêm vào mà chưa lưu vào cơ sở dữ liệu.

Gọi phương thức Remove trên một thực thể mới được thêm nhưng chưa được lưu vào cơ sở dữ liệu sẽ hủy việc thêm thực thể đó. Thực thể được xóa khỏi trình theo dõi thay đổi và không còn được theo dõi bởi DbContext.

Gọi phương thức Remove trên một thực thể hiện đang có thay đổi sẽ đăng ký thực thể để xóa trong lần gọi SaveChanges tiếp theo.

Ví dụ sau đây cho thấy một trường hợp trong đó học sinh bị xóa khỏi cơ sở dữ liệu có tê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).FirstOrDefault();
                 
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}

Xem thông tin thực thể

Bạn có thể xem thông tin của một hoặc nhiều thực thể tùy ý theo điều kiện bạn cung cấp. Trong đoạn mã sau sẽ có hai phương thức lấy thông tin Student theo Id và lấy danh sách Student theo tên.

private static Student GetStudentById(int id) 
{
  using (var context = new UniContext()) 
  {
	 var student = (from d in context.Students
					where d.ID == id 
					select d).FirstOrDefault();
					
	 return student;
  }
}

private static List<Student> GetStudentsByName(string name) 
{
  using (var context = new UniContext()) 
  {
	 var students = (from d in context.Students
					where d.LastName == name
					select d).ToList();
					
	 return students;
  }
}


Bài viết liên quan:

2 kịch bản lưu dữ liệu trong Entity Framework Core là kịch bản được kết nối và kịch bản ngắt kết nối.

Tạo ứng dụng .NET Core Console đầu tiên và cấu hình sử dụng Entity Framework Core.

Truy vấn trong Entity Framework Core có gì mới? Truy vấn trong EF Core khác EF ở những điểm nào.