對於主外來鍵約定的理解,其實是學習實體間一對一和一對多關係的基礎。
1.1 主鍵(Key)約定
主鍵的預設約定是:只要欄位名為–實體名(類名)+”id”(不區分大小寫),這就算是預設的主鍵約定。
如果要顯示標識的話,就使用特性標籤進行標識:
public class Student
{
[Key]
public int StudentKey { get; set; }
public string StudentName { get; set; }
}
這樣標識的主鍵,在資料庫的名稱就是StudentKey
2.1 外來鍵(ForeignKey)約定
外來鍵約定稍微複雜一些,主要分為三種形式的顯示指定外來鍵和預設的外來鍵約定。在一對一關係中比較簡單,在一對多關係中約定規則多一些。
2.1.1 一對一關係中的外來鍵約定
在文件中,這種叫做One-to-Zero-or-One Relationship,這種關係必須手動指定主從表,因為在一個一對一關係中,系統是沒法推測出來誰是主表誰是從表的,而且因為從表的主鍵也是主表的主鍵,也是從表的外來鍵,所以沒有必要和多對多關係那樣,指定一個欄位作為外來鍵,或者為外來鍵設定一個友好欄位名,這些都是不需要的。
EF中的一對一關係實現如下:
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
[ForeignKey("Student")]
public int StudentAddressId { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public virtual Student Student { get; set; }
}
2.1.2 一對一關係的Fluent API實現
欠著
2.2.1 一對多關係中的外來鍵約定
預設約定:
預設約定,只需要兩個導航屬性就能實現,student中會根據兩個表名,把standard表的主鍵作為student的外來鍵生成一個長名。
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
//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; }
}
當然如果覺得系統生成的名稱不友好,我們可以自己設定外來鍵的名字,其中預設的配置規則是entity中如果有欄位是導航屬性的名稱+id(不區分大小寫),即把這個欄位設定成外來鍵。
顯示指定
當然我們可以使用特性標籤[ForeignKey]來指定某個欄位作為外來鍵:
[ForeignKey("Standard")]
public int StandardRefId { get; set; }
這樣的話,外來鍵名稱就叫StandardRefId。
我們也可以把標籤屬性放在導航屬性,指定某個欄位作為被特性標籤修飾的導航屬性在當前實體的外來鍵。
[ForeignKey("StandardRefId")]
public Standard Standard { get; set; }
最後一種,我們可以在主表的導航屬性上,也就是字表的ICollection集合上,用特性標籤指定外來鍵:
public class Standard
{
public int StandardId { get; set; }
public string StandardName { get; set; }
[ForeignKey("StandardRefId")]
public ICollection<Student> Students { get; set; }
}