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就可以達到一樣的效果,不一定兩邊都要加
這樣設計出來的資料庫跟關係,就會是我們要的了。
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。