根據慣例進行一對多對映
在最後一個示例中,你可以看到 EF 確定哪個列是外來鍵,以及它應指向哪個列。怎麼樣?通過使用約定。具有 Person
型別的屬性,其名稱為 Person
,具有 PersonId
屬性,導致 EF 得出 PersonId
是外來鍵的結論,並且它指向由 Person
型別表示的表的主鍵。
但是,如果你要改變 PERSONID 到 OWNERID 和人對業主的車型別?
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
有一個必需的屬性 Owner
( HasRequired()
),在 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
側的關係無關緊要。你甚至可以包括兩者,但在這種情況下要注意在兩邊指定相同的關係!