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ể Student
và Standard
. Để 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.
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:
- Khai báo
[ForeignKey(NavigationPropertyName)]
trên thuộc tính khóa ngoại trong thực thể phụ thuộc. - 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. - 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.
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.