一對一對映
一對一對映(當需要雙方時)也是一件棘手的事情。
讓我們想象一下如何使用外來鍵來表示它。同樣,在 People
中的 CarId
指的是 Car
中的 CarId
,而在 car 中的 PersonId
指的是 People
中的 PersonId
。
現在如果要插入汽車記錄會發生什麼?為了使此成功,必須在此車記錄中指定 PersonId
,因為它是必需的。並且為了使這個 PersonId
有效,必須存在 People
中的相應記錄。好的,讓我們繼續並插入人員記錄。但為了成功,一個有效的 CarId
必須在人的記錄中 - 但那輛車還沒有插入! 它不可能,因為我們必須首先插入推薦人員記錄。但是我們不能插入引用的人員記錄,因為它引用了汽車記錄,所以必須先插入(外來鍵 - 密碼:))。
因此,這也不能代表邏輯方式。同樣,你必須刪除其中一個外來鍵。你放棄哪一個取決於你。留有外來鍵的一方稱為依賴,沒有外來鍵的一方稱為委託。同樣,為了確保依賴項的唯一性,PK 必須是 FK,因此不支援新增 FK 列並將其匯入模型。
所以這是配置:
public class CarEntityTypeConfiguration : EntityTypeConfiguration<Car>
{
public CarEntityTypeConfiguration()
{
this.HasRequired(c => c.Person).WithRequiredDependent(p => p.Car);
this.HasKey(c => c.PersonId);
}
}
到現在為止你真的應該已經掌握了它的邏輯:)只要記住你也可以選擇另一方,只需要小心使用 WithRequired 的 Dependent / Principal 版本(你仍然需要在 Car 中配置 PK)。
public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
public PersonEntityTypeConfiguration()
{
this.HasRequired(p => p.Car).WithRequiredPrincipal(c => c.Person);
}
}
如果檢查資料庫模式,你會發現它與一對一或零解決方案的情況完全相同。那是因為這不是由架構強制執行的,而是由 EF 本身強制執行的。所以再次,小心:)