實施此類解決方案的困難和可能性在下面的示例中討論。
映射一到一個
映射一到一個(當需要雙方)也是一個棘手的事情。
讓我們想象一下如何用外鍵表示它。同樣,People
中的CarId
,其參考Car
中的CarId
,以及Car中的PersonId
,其參考People
中的PersonId
。
現在如果你想插入汽車記錄會發生什麼?爲了獲得成功,必須在本賽車記錄中指定PersonId
,因爲這是必需的。對於此PersonId
有效,必須存在People
中的相應記錄。好的,讓我們繼續並插入人員記錄。但爲了取得這個成功,一個有效的CarId
必須在人員記錄—中,但該車還沒有插入!這不可能,因爲我們必須先插入引用的人員記錄。但是我們不能插入引用的人員記錄,因爲它引用了汽車記錄,所以必須先插入(外鍵 - ception :))。
所以這也不能用'邏輯'的方式表示。再次,您必須刪除其中一個外鍵。你放棄哪一個取決於你。留有外鍵的一面稱爲「依賴」,沒有外鍵的一面稱爲「主體」。再次,爲了確保依賴項中的唯一性,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版本(你仍然需要在車上配置PK)。
public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
public PersonEntityTypeConfiguration()
{
this.HasRequired(p => p.Car).WithRequiredPrincipal(c => c.Person);
}
}
如果檢查DB模式,你會發現,這是完全一樣的,因爲它是在一個對一或零解的情況。這是因爲再次,這不是由模式強制執行,而是由EF本身執行。如此反覆,要小心:)