2017-06-13 183 views
0

有沒有辦法在實體框架中創建一對一或多個關係?我已經看到很多示例顯示1到0 .. *的關係,但我想確保在給定示例中Foo只能存在,如果它至少有一個Bar。EF 1至1 .. *關係

class Foo 
{ 
    List<Bar> Bars { get; set; } 
} 

class Bar 
{ 
    public Foo Foo { get; set; } 
} 

我看,這是不容易被SQL實現,因爲我想在富表而不是在酒吧桌子一種NOT NULL,但實體框架處理呢?

我意識到我問錯了問題,因爲我實際上尋找0..1 1 .. *關係,這是顯著不同。 This是我想問的問題。

回答

0

在我意識到的任何SQL數據庫中,不可能有真正的1對1關係。雖然集合論允許1比1,但實際上這很難實現。

這基本上是雞和雞蛋的情況。您無法創建Foo,因爲您沒有酒吧,並且您無法創建酒吧,因爲還沒有Foo。創建1到1所需的約束基本上阻止您插入任何實際行。

現在,您可以禁用約束,插入數據,然後重新啓用它們,但這是一個真正破壞了約束條件的hacky kludge。

所以只需接受1到0 .. *然後繼續。

0

實施此類解決方案的困難和可能性在下面的示例中討論。


映射一到一個

映射一到一個(當需要雙方)也是一個棘手的事情。

讓我們想象一下如何用外鍵表示它。同樣,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本身執行。如此反覆,要小心:)

0

接近你可以得到的是這樣的:

class Foo 
{ 
    List<Bar> Bars { get; set; } 

    [Required] 
    public int PrimaryBarId { get; set; } 
    public Bar PrimaryBar { get; set; } 
} 

class Bar 
{ 
    public Foo Foo { get; set; } 
} 

但是請注意,該數據庫將不會強制

aFoo.PrimaryBar.FooId == aFoo。 Id

由於圓形FKs,這種模型很難更新。