2014-05-08 25 views
39

我認爲這可能有助於得出關於何時使用WithOptionalDependent以及何時使用WithOptionalPrincipal的明確答案。這兩個函數的幫助有點不清楚,我發現自己通過多個Stack Overflow解答和其他站點上的答案組合來解答問題,以便確信自己已經把關係轉向了正確的方向。WithOptionalDependent vs WithOptionalPrinciple - Definitive Answer?

這裏的MSDN說怎麼樣WithOptionalDependent

配置是可選的關係:無可選的關係的另一側的 導航屬性。被配置的實體 類型將是依賴項,並且包含主體的外鍵 。關係目標的實體類型將爲 爲關係中的主體。

,這裏是是怎麼說WithOptionalPrincipal

配置是可選的關係:無可選的關係的另一側的 導航屬性。正在配置的實體 將成爲關係中的主體。該關係所針對的 實體類型將成爲依賴關係,而 包含該主體的外鍵。

「正在配置的實體類型」這一行總是讓我感到困惑(我假設其他人)。

在這個例子中:

class MyEntityA 
{ 
    [Key] 
    public int Id { get; set; } 
    public int BId { get; set; } 
    [ForeignKey("BId")] 
    public MyEntityB B { get; set; } 
} 

class MyEntityB 
{ 
    [Key] 
    public int Id { get; set; } 
} 

modelBuilder.Entity<MyEntityA>().HasOptional(a => a.B).WithOptionalDependent(); 

是 「的實體類型被配置」 指的是MyEntityAMyEntityB?我認爲這是前者。

如果這是正確的,那麼什麼時候使用WithOptionalPrincipal

我實際上在我的代碼示例中認爲它應該確實是WithMany,而且沒有WithOptional選項。顯然我還是很困惑!

這些函數都有重載,導致導航屬性走向另一個方向。我認爲這些超載不會改變這些答案,但如果我錯了,請糾正我。

我希望這對更大的社區也有幫助。

回答

10

例如,讓我們通過導航屬性修改您的EntityB,並使BId爲空(因爲我們正在談論可選關係)。

class MyEntityA 
{ 
    [Key] 
    public int Id { get; set; } 
    public int? BId { get; set; } 

    [ForeignKey("BId")] 
    public virtual MyEntityB B { get; set; } 
} 

class MyEntityB 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual MyEntityA A { get; set; } 
} 

然後我們可以使用:

modelBuilder.Entity<MyEntityB>().HasOptional(a => a.A).WithOptionalPrincipal(); 

MyEntityAFKMyEntityB,所以在你的exapmle配置MyEntityA和使用WithOptionalDependent。但是您可以從MyEntityB -side開始配置,那麼您需要WithOptionalPrincipal。

4

回答你的問題是:「正在配置的實體類型」是MyEntityA

這可以明確通過在documentation尋找

OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType> 

可以看出這是HasOptional返回的類型和它說:

TTargetEntityType

關係所針對的實體類型。

這爲詞更多的上下文:

的實體類型配置

的關係定位

所以實體類型,你的情況,你回來from HasOptional an

OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB> 

因此,WithOptionalDependent意味着MyEntityB將是校長與可選導航屬性指回MyEntityA(通過過載的lambda參數指定)和MyEntityA將成爲依賴,幷包含一個外鍵和導航屬性(如在規定lambda參數HasOptional)。 這是您模型中的場景。

相反,WithOptionalPrincipal意味着MyEntityA將是校長和MyEntityB與外鍵和導航屬性從屬。

相關問題