一對一對映

一對一對映(當需要雙方時)也是一件棘手的事情。

讓我們想象一下如何使用外來鍵來表示它。同樣,在 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 本身強制執行的。所以再次,小心:)