EF Code-First - Thuộc tính khóa ngoại

Thuộc tính khóa ngoại trong Entity Framework

Thuộc tính ForeignKey (ForeignKey Attribute) được sử dụng để cấu hình khóa ngoại trong mối quan hệ giữa hai thực thể trong EF 6 và EF Core.

Nó ghi đè các quy ước mặc định. Theo quy ước mặc định, EF tạo một thuộc tính là thuộc tính khóa ngoài khi tên của nó khớp với thuộc tính khóa chính của một thực thể có liên quan.

Khai báo thuộc tính ForeignKey: [ForeignKey(name string)]

  • name: Tên của thuộc tính điều hướng được liên kết hoặc tên của (các) khóa ngoại được liên kết.

Hãy xem ví dụ sau đây về mối quan hệ một-nhiều giữa các thực thể.

using System.ComponentModel.DataAnnotations.Schema;

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
        
    //Foreign key for Standard
    public int StandardId { get; set; }
    public Standard Standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    public ICollection<Student> Students { get; set; }
}

Ví dụ trên mô tả mối quan hệ một-nhiều giữa các thực thể StudentStandard. Để thể hiện mối quan hệ này, lớp Student bao gồm một thuộc tính StandardId có thuộc tính tham chiếu Standard và lớp thực thể Standard bao gồm thuộc tính điều hướng danh sách Students.

Tên thuộc tính StandardId trong thực thể Student khớp với thuộc tính khóa chính của thực thể Standard. Do đó, thuộc tính StandardId trong thực thể Student sẽ tự động trở thành thuộc tính khóa ngoài và cột tương ứng trong bảng db cũng sẽ là cột khóa ngoài, như được hiển thị bên dưới.

Entity Framework code-first example

Thuộc tính ForeignKey ghi đè các quy ước mặc định cho một khóa ngoại. Nó cho phép chúng ta chỉ định thuộc tính khóa ngoại trong thực thể phụ thuộc có tên không phù hợp với thuộc tính khóa chính của thực thể chính.

Thuộc tính ForeignKey có thể được áp dụng theo ba cách:

  1. Khai báo [ForeignKey(NavigationPropertyName)] trên thuộc tính khóa ngoại trong thực thể phụ thuộc.
  2. Khai báo [ForeignKey(ForeignKeyPropertyName)] trên thuộc tính điều hướng tham chiếu có liên quan trong thực thể phụ thuộc.
  3. Khai báo [ForeignKey(ForeignKeyPropertyName)] trên thuộc tính điều hướng trong thực thể chính.

ForeignKey Attribute trên thuộc tính khóa ngoại trong thực thể phụ thuộc

Khai báo ForeignKey trên thuộc tính khóa ngoại trong thực thể phụ thuộc và tên thuộc tính định vị liên quan được khai báo như một tham số như dưới đây.

using System.ComponentModel.DataAnnotations.Schema;

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
        
    [ForeignKey("Standard")]
    public int StandardRefId { get; set; }
    public Standard Standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    public ICollection<Student> Students { get; set; }
}

Trong ví dụ trên, thuộc tính ForeignKey được áp dụng trên thuộc tính StandardRefId và chỉ định tên của thuộc tính điều hướng là Standard.

Điều này sẽ tạo cột khóa ngoại có tên StandardRefId trong bảng Students, ngăn chặn việc tạo cột StandardId trong cơ sở dữ liệu.

Entity Framework code-first example


ForeignKey Attribute trên thuộc tính điều hướng trong thực thể phụ thuộc

Thuộc tính ForeignKey có thể được áp dụng cho thuộc tính chuyển hướng và tên thuộc tính khóa ngoại liên quan được khai báo như dưới đây.


using System.ComponentModel.DataAnnotations.Schema;

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
        
    public int StandardRefId { get; set; }
    
    [ForeignKey("StandardRefId")]
    public Standard Standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    public ICollection<Student> Students { get; set; }
}

Trong ví dụ trên, thuộc tính ForeignKey được áp dụng trên thuộc tính điều hướng Standard và chỉ định tên của thuộc tính khóa ngoại là StandardRefId.

Điều này sẽ tạo cột khóa ngoại có tên StandardRefId trong bảng Students, ngăn chặn việc tạo cột StandardId trong cơ sở dữ liệu.


ForeignKey Attribute trên thuộc tính điều hướng trong thực thể chính

Thuộc tính ForeignKey có thể được áp dụng cho thuộc tính chuyển hướng trong thực thể chính và chỉ định tên thuộc tính khóa ngoại của thực thể phụ thuộc, như dưới đây.


using System.ComponentModel.DataAnnotations.Schema;

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
        
    public int StandardRefId { get; set; }
    public Standard Standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    [ForeignKey("StandardRefId")]
    public ICollection<Student> Students { get; set; }
}

Trong ví dụ trên, thuộc tính ForeignKey được áp dụng trên thuộc tính điều hướng Students trong thực thể chính Standard. Điều này sẽ tạo ra một cột khóa ngoại StandardRefId trong bảng Students trong cơ sở dữ liệu.