III. Những quan hệ của thực thể

Phần này bạn sẽ học được Entity Framework quản lý quan hệ giữa những thực thể như thế nào.

Entity Framework hỗ trợ 3 kiểu quan hệ giống như CSDL: One to One, One to Many, và Many to Many.

Chúng ta đã tạo một Entity Data Model cho CSDL SchoolDB trong phần Tạo Entity Data Model. Hình minh họa sau thể hiện visual designer cho EDM đó với tất cả các thực thể và quan hệ giữa chúng.

Entity relationships in entity framework

Hãy nhìn xem Entity Framework đã quản lý mỗi quan hệ như thế nào.

Quan hệ One-to-One:

Như bạn nhìn thấy trong hình minh họa ở trên, Student và StudentAddress có quan hệ One-to-One (không hoặc một). Một sinh viên có thể có chỉ một hoặc không có địa chỉ nào. Entity Framework thêm thuộc tính điều hướng Student vào thực thể StudentAddress và thuộc tính điều hướng StudentAddress vào thực thể Student. Cũng như thực thể StudentAddress có thuộc tính StudentId như là PrimaryKey điều đó làm nó thành một quan hệ One-to-One.

Đoạn mã ngắn sau thể hiện những lớp thực thể Student và StudentAddress.

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 Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }
    public virtual ICollection<Course> Courses { 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; }
}

Như bạn nhìn thấy trong đoạn mã trên, lớp thực thể Student có thuộc tính điều hướng StudentAddress và StudentAddress có thuộc tính điều hướng Student với thuộc tính khóa ngoại StudentId. Cách này EF kiểm soát quan hệ one-to-one giữa những thực thể.

Quan hệ One-to-Many:

Thực thể Standard và Teacher có một quan hệ One-to-Many đánh dấu bằng số bội mà ở đó 1 là dành cho One và * là cho many. Điều này có nghĩa rằng Standard có thể có nhiều Teachers trong khi Teacher có thể kết hợp với chỉ một Standard.

Để thể hiện điều này, thực thể Standard có tập hợp thuộc tính điều hướng Teachers (vui lòng chú ý nó là số nhiều) chỉ ra rằng một Standard có thể có một tập hợp Teachers (many Teachers). Và thực thể Teacher có chỉ một thuộc tính điều hướng Standard (không phải một tập hợp) chỉ ra rằng Teacher là kết hợp với chỉ một Standard. Nó cũng có khóa ngoại StandardId (StandardId là một PK trong thực thể Standard). Điều này biến nó thành quan hệ One-to-Many.

Đ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.Students = new HashSet<Student>();
        this.Teachers = new HashSet<Teacher>();
    }
    
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    public string Description { get; set; }
    
    public virtual ICollection<Student> Students { 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> StandardId { get; set; }
    public Nullable<int> TeacherType { get; set; }
    
    public virtual ICollection<Course> Courses { get; set; }
        
    public virtual Standard Standard { get; set; }
}

Như bạn nhìn thấy trong đoạn mã trên, lớp thực thể Standard có thuộc tính Teachers kiểu ICollection để nó có thể chứa nhiều đối tượng Teacher. (Nó khởi tạo thuộc tính Teachers với HashSet<Teacher> trong hàm tạo để bạn có thể thêm đối tượng Teacher vào tập hợp mà không phải lo lắng về việc khởi tạo nó.)

Lớp thực thể Teacher cũng có thuộc tính Standard với StandardId cho thuộc tính khóa ngoại. Entity Framework có thuộc tính khóa ngoại này bởi vì chúng ta đã check Include foreign key columns in the model checkbox trong EDM wizard khi tạo EDM trong phần Tạo Entity Data Model.

Quan hệ Many-to-Many:

Student và Course có quan hệ Many-to-Many đánh dấu bằng số bội *. Nó có nghĩa là một Student có thể đăng ký nhiều Courses và một Course cũng có thể dạy cho nhiều Students.

Thiết kế CSDL gồm bảng nối StudentCourse và nó có khóa chính của cả hai bảng (Student và Course). Entity Framework thể hiện quan hệ many-to-many không phải bằng cách tạo một tập thực thể cho bảng nối mà thay vì đó nó quản lý qua mapping.

Như bạn nhìn thấy ở hình trên, thực thể Student có thuộc tính Courses và thực thể Course có thuộc Students để thể hiện cho quan hệ many-to-many giữa chúng.

Đoạn mã sau trình bày lớp thực thể 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 Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { 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 Nullable<int> TeacherId { get; set; }
    
    public virtual Teacher Teacher { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

Note: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/>

entity relationships in entity framework

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.

entity relationships in entity framework

Nguồn: http://www.entityframeworktutorial.net/

Advertisements