根據慣例進行一對多對映

在最後一個示例中,你可以看到 EF 確定哪個列是外來鍵,以及它應指向哪個列。怎麼樣?通過使用約定。具有 Person 型別的屬性,其名稱為 Person,具有 PersonId 屬性,導致 EF 得出 PersonId 是外來鍵的結論,並且它指向由 Person 型別表示的表的主鍵。

但是,如果你要改變 PERSONIDOWNERID業主型別?

public class Car
{
   public int CarId { get; set; }
   public string LicensePlate { get; set; }
   public int OwnerId { get; set; }
   public virtual Person Owner { get; set; }
}

好吧,不幸的是,在這種情況下,約定不足以生成正確的資料庫模式:

別擔心; 你可以幫助 EF 提供有關你的關係和模型中的鍵的一些提示。只需配置 Car 型別即可將 OwnerId 屬性用作 FK。建立實體型別配置並將其應用於 OnModelCreating()

public class CarEntityTypeConfiguration : EntityTypeConfiguration<Car>
{
  public `CarEntityTypeConfiguration()`
  {
     this.HasRequired(c => c.Owner).WithMany(p => p.Cars).HasForeignKey(c => c.OwnerId);
  }
}

這基本上說 Car 有一個必需的屬性 OwnerHasRequired() ),在 Owner 的型別中,Cars 屬性用於引用汽車實體( WithMany() )。最後指定了表示外來鍵的屬性( HasForeignKey() )。這為我們提供了我們想要的架構:

你也可以從 Person 側配置關係:

public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
  public `PersonEntityTypeConfiguration()`
  {
    this.HasMany(p => p.Cars).WithRequired(c => c.Owner).HasForeignKey(c => c.OwnerId);
  }
}

這個想法是一樣的,只是兩邊是不同的(注意你如何閱讀整個事情:‘這個人有很多車,每輛車都有一個必需的車主’)。如果你配置 Person 側或 Car 側的關係無關緊要。你甚至可以包括兩者,但在這種情況下要注意在兩邊指定相同的關係!