[Entity Framework][Code First]Inverse Navigation Properties

Inverse Navigation Properties

需求

這邊以Course與Teacher來說明:

每一個Course都包含一個主要老師(PrimaryTeacher)代課老師(SecondaryTeacher),Course的設計如下:

public class Course
{
    public int CourseId { get; set; }

    public string Name { get; set; }
    
    public Teacher PrimaryTeacher { get; set; }

    public Teacher SecondaryTeacher { get; set; }
}

每一個老師都可以查到自己是主要老師的課程(PrimaryCourses)有哪些以及是代課老師的課程(SecondaryCourses)有哪些,Teacher的設計如下

public class Teacher
{
    public int TeacherId { get; set; }

    public string Name { get; set; }
    
    public ICollection<Course> PrimaryCourses { get; set; }
    
    public ICollection<Course> SecondaryCourses { get; set; }
}

而這是我們期望建立出來的關係

  • PrimaryCourses對應到一個PrimaryTeacher_teacherId
  • SecondaryCourses對應到一個SecondaryTeacher_teacherId

依照上面的設計,會因為Code Convention不知道PrimaryCourses要對應到PrimaryTeacher還是SecondaryTeacher,所以會產生如下圖,非常詭異的關係,多了兩條莫名其妙的關聯

這也會造成資料庫上產生兩個完全用不到的foreign key

這並不是我們要的結果,而且這種結果,使用Entity Framework來讀取資料的話,會造成讀不到的窘境。

 

Inverse Navigation Properties

所以我們需要加上InverseProperty處理這樣的關係,如下:

public class Course
{
    public int CourseId { get; set; }

    public string Name { get; set; }

    [InverseProperty("PrimaryCourses")]
    public Teacher PrimaryTeacher { get; set; }

    [InverseProperty("SecondaryCourses")]
    public Teacher SecondaryTeacher { get; set; }
}

public class Teacher
{
    public int TeacherId { get; set; }

    public string Name { get; set; }

    [InverseProperty("PrimaryTeacher")]
    public ICollection<Course> PrimaryCourses { get; set; }

    [InverseProperty("SecondaryTeacher")]
    public ICollection<Course> SecondaryCourses { get; set; }
}

備註:只要一個Domain Class有加上InverseProperty就可以達到一樣的效果,不一定兩邊都要加

這樣設計出來的資料庫跟關係,就會是我們要的了。

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。