EF Code First中的主外來鍵約定和一對一、一對多關係的實現

天街小雨&發表於2018-03-22

對於主外來鍵約定的理解,其實是學習實體間一對一和一對多關係的基礎。

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; }
}

相關文章