EF 6 - Mối quan hệ trong EF 6
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)
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-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.
Như bạn có thể thấy trong sơ đồ trên, Student và StudentAddress có mối quan hệ Một-Một (không hoặc một). Một sinh viên chỉ có thể có một hoặc không có địa chỉ.
public partial class Student
{
public Student()
{
this.Courses = new HashSet<Course>();
}
public int StudentID { get; set; }
public string StudentName { get; set; }
public Nullable<int> StandardId { get; set; }
public byte[] RowVersion { get; set; }
public virtual StudentAddress StudentAddress { get; set; }
}
public partial class StudentAddress
{
public int StudentID { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public virtual Student Student { get; set; }
}
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 Standard và Teachers có mối quan hệ Một-Nhiều được đánh dấu bằng tính đa dạng, trong đó 1 là Một và * là cho Nhiều. Điều này có nghĩa là Lớp học có thể có nhiều Giáo viên trong khi Giáo viên chỉ có thể kết hợp với một Lớp học .
Đoạn mã bên dưới thể hiện lớp thực thể Standard và Teacher được tạo bởi EDM.
public partial class Standard
{
public Standard()
{
this.Teachers = new HashSet<Teacher>();
}
public int StandardId { get; set; }
public string StandardName { get; set; }
public string Description { get; set; }
public virtual ICollection<Teacher> Teachers { get; set; }
}
public partial class Teacher
{
public Teacher()
{
this.Courses = new HashSet<Course>();
}
public int TeacherId { get; set; }
public string TeacherName { get; set; }
public Nullable<int> TeacherType { get; set; }
public Nullable<int> StandardId { get; set; }
public virtual Standard Standard { get; set; }
}
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ụ: Student và Course có mối quan hệ Nhiều-Nhiều được đánh dấu bằng * tính đa dạng. Nó có nghĩa là một Sinh viên có thể đăng ký nhiều Khóa học và một Khóa học cho nhiều Học viên.
Đoạn mã sau chứa lớp Course và hai lớp trên, tức là Student và Course
.
public partial class Student
{
public Student()
{
this.Courses = new HashSet<Course>();
}
public int StudentID { get; set; }
public string StudentName { get; set; }
public Nullable<int> StandardId { get; set; }
public byte[] RowVersion { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public partial class Course
{
public Course()
{
this.Students = new HashSet<Student>();
}
public int CourseId { get; set; }
public string CourseName { get; set; }
public System.Data.Entity.Spatial.DbGeography Location { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
Chú ý:Entity Framework hỗ trợ quan hệ many-to-many chỉ khi bảng nối (StudentCourse trong trường hợp này) không có bất kỳ cột nào khác ngoài khóa chính của hai bảng. Nếu bảng nối chứa những cột bổ sung như là DateCreated rồi EDM cũng tạo thực thể cho bảng trung gian và bạn sẽ phải quản lý thao tác CRUD cho những thực thể many-to-many bằng tay.
Mở EDM trong XML view. Bạn có thể nhìn thấy SSDL có tập thực thể StudentCourse nhưng CSDL thì không có tập thực thể này. Thay vì đó nó đang nối vào thuộc tính điều hướng của thực thể Student và Course. Trong MSL (C-S Mapping), nó có kết nối giữa Student và Course đưa vào bảng StudentCourse trong mục <AssociationSetMapping/>
Như vậy quan hệ Many-to-Many đang được quản lý bởi C-S mapping trong EDM. Vậy thì khi bạn thêm một Student vào một Course hoặc một Course vào một thực thể Student và lưu nó, nó sẽ thêm khóa chính của sinh viên và khóa học mới được thêm vào bảng StudentCourse. Vậy mapping này không chỉ kích hoạt một liên kết thích hợp trực tiếp giữa hai thực thể mà còn quản lý truy vấn, inserts, và updates qua kết nối này.
Entity Graph:
Khi một thực thể có một quan hệ với những thực thể khác thì hệ phân cấp đầy đủ các đối tượng được gọi là ‘entity graph. Ví dụ sau là một Student entity graph gồm phân cấp của thực thể Student với những thực thể Standard, StudentAddress và Course.