Mối quan hệ trong Entity Framework

Trong cơ sở dữ liệu quan hệ, mối quan hệ là một liên kết tồn tại giữa các bảng của cơ sở dữ liệu quan hệ thông qua các khóa ngoại.

Khóa ngoại (Foreign Key) là một cột hoặc tổ hợp các cột được sử dụng để thiết lập và thực thi một liên kết giữa dữ liệu trong hai bảng. Sơ đồ sau có chứa ba bảng.

  • Student (sinh viên)
  • Course (khóa học)
  • Enrollment (ghi danh)
Thiết lập cơ sở dữ liệu

Trong sơ đồ trên, bạn có thể thấy một số loại liên kết / mối quan hệ giữa các bảng. Có ba loại mối quan hệ giữa các bảng và chúng khác nhau tùy thuộc vào cách định nghĩa các cột liên quan.

  • Mối quan hệ một-nhiều
  • Mối quan hệ nhiều-nhiều
  • Mối quan hệ một-một

Mối quan hệ một-nhiều

  • Mối quan hệ một-nhiều là loại mối quan hệ phổ biến nhất.
  • Trong loại mối quan hệ này, một bản ghi trong bảng A có thể có liên kết tới nhiều bản ghi trong bảng B, nhưng một bản ghi trong bảng B chỉ có thể có một liên kết tới một bản ghi trong bảng A.
  • Khóa ngoại được định nghĩa trong bảng có nhiều điểm cuối của mối quan hệ.
  • Ví dụ, trong sơ đồ trên, bảng Student và Enrollment có mối quan hệ một-nhiều, mỗi sinh viên có thể đăng ký cho nhiều môn học, nhưng mỗi đăng ký chỉ thuộc về một sinh viên.

Trong Entity Framework, các mối quan hệ này cũng có thể được tạo bằng mã. Sau đây là một ví dụ về các lớp Student và Enrollment được liên kết với một quan hệ một-nhiều.

public class Student 
{
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime EnrollmentDate { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public class Enrollment 
{
   public int EnrollmentID { get; set; }
   public int CourseID { get; set; }
   public int StudentID { get; set; }
	
   public Grade? Grade { get; set; }
   public virtual Course Course { get; set; }
   public virtual Student Student { get; set; }
}

Trong đoạn mã trên, bạn có thể thấy rằng lớp Student chứa tập hợp Enrollment, nhưng lớp Enrollment có một đối tượng Student duy nhất.

Mối quan hệ nhiều-nhiều

Trong mối quan hệ nhiều-nhiều, một bản ghi trong bảng A có thể có nhiều liên kết tới các bản ghi trong bảng B và ngược lại.

  • Bạn có thể tạo mối quan hệ như vậy bằng cách định nghĩa bảng thứ ba, được gọi là bảng nối, có khóa chính bao gồm các khóa ngoại từ cả bảng A và bảng B.
  • Ví dụ: các bảng Student và Course có mối quan hệ nhiều-nhiều được xác định bởi mối quan hệ một-nhiều từ mỗi bảng này đến bảng Enrollment.

Đoạn mã sau chứa lớp Course và hai lớp trên, tức là Student và Enrollment.

public class Course 
{
   [DatabaseGenerated(DatabaseGeneratedOption.None)]	
   public int CourseID { get; set; }
   public string Title { get; set; }
	
   public int Credits { get; set; } 
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

Bạn có thể thấy rằng cả lớp Course và lớp Student đều có một tập hợp các đối tượng Enrollment, điều này tạo ra mối quan hệ nhiều-nhiều thông qua lớp Enrollment.

Mối quan hệ một-một

  • Trong mối quan hệ một-một, một bản ghi trong bảng A có thể có tối đa một liên kết tới một bản ghi trong bảng B và ngược lại.
  • Mối quan hệ một-một được tạo nếu cả hai cột liên quan là khóa chính hoặc có các ràng buộc duy nhất.
  • Trong mối quan hệ một-một, khóa chính đóng vai trò là khóa ngoại và không có cột khóa ngoại riêng biệt cho một trong hai bảng.

Loại mối quan hệ này không phổ biến vì hầu hết thông tin liên quan theo cách này có thể đưa vào trong cùng một bảng. Bạn có thể sử dụng mối quan hệ một-một trong những trường hợp sau:

  • Chia tách một bảng có quá nhiều cột thành hai bảng.
  • Cô lập một phần của bảng vì lý do bảo mật.
  • Lưu trữ dữ liệu tồn tại trong thời gian ngắn và có thể dễ dàng xóa bằng cách xóa bảng.
  • Lưu trữ thông tin chỉ áp dụng cho một tập hợp con của bảng chính.

Đoạn mã sau đây sẽ thêm một tên lớp StudentProfile chứa thông tin id, email và password của sinh viên.

public class Student 
{
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime EnrollmentDate { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
   public virtual StudentProfile StudentProfile { get; set; }
}

public class StudentProfile 
{
   public StudentProfile() 
   {}
   
   public int ID { get; set; }
   public string Email { get; set; }
   public string Password { get; set; }
	
   public virtual Student Student { get; set; }
}

Bạn có thể thấy rằng lớp thực thể Student chứa thuộc tính điều hướng StudentProfile và lớp StudentProfile cũng chứa thuộc tính điều hướng Student.

Mỗi sinh viên chỉ có một email và mật khẩu để đăng nhập. Những thông tin này có thể được thêm vào bảng Student nhưng vì lý do bảo mật, nó được tách ra một bảng khác.



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.