2013-10-14 61 views
29

我有一個類AgentBalance與關聯代理,即:EF代碼優先流利的API指定外鍵屬性

public class AgentBalance 
{ 
    ... 

    public int AgentId { get; set; } 

    public virtual Agent Agent { get; set; } 

} 

AGENTID被檢測爲FK由約定的委託代理關係,但我想在Mapping類中明確表示,以便對未來的變化更安全。如果代理有餘額的集合,然後我知道如何做到這一點例如爲:

HasRequired(t => t.Agent).WithMany(a => a.Balances).HasForeignKey(t => t.AgentId); 

然而,代理有餘額的集合 - 我不希望該協會是反向通航。但沒有映射中的.WithMany,我沒有選擇指定.HasForeignKey。有另一種方法嗎? (N.B.我知道我也可以使用屬性來做到這一點,但我想使用流暢的API映射)。

回答

48

我相信你應該能夠做到這一點:

HasRequired(t => t.Agent).WithMany().HasForeignKey(t => t.AgentId) 
+6

謝謝 - 我已經錯過了WithMany()超載!儘管如此,似乎是一種奇怪的語法我不明白他們爲什麼不能讓你寫下如下內容:HasRequired(t => t.Agent).HasForeignKey(t => t.AgentId) –

+1

EF沒有辦法知道類型它的關係。 – SOfanatic

+2

這不適合我。 EF除了我已經明確配置爲外鍵列的AgentId外,還創建了一個新的Agent_Id列。你知道爲什麼會發生這種情況嗎? – Yulian

1

我更喜歡使用數據註釋這些任務,不流利的API。它簡短得多,易於理解。 EF必須檢測特性與「ID」自動結束,但要在安全起見,你可以明確指定:

using System.ComponentModel.DataAnnotations.Schema; 
... 
public int AgentId { get; set; } 

[ForeignKey("AgentId")] 
public virtual Agent Agent { get; set; } 

您將需要顯式地指定他們,如果你的FK道具不與「ID」結束,例如:

public int AgentCode { get; set; } 

[ForeignKey("AgentCode")] // now this is needed if you'd like to have FK created 
public virtual Agent Agent { get; set; } 

你可以找到更多的細節在這裏:https://msdn.microsoft.com/en-us/data/jj591583.aspx

+9

數據註解是,我同意,更易於閱讀。但是,海事組織不是一種管理大型複雜項目的好方法,這是我的背景。 –

+0

@RichardPawson爲什麼不呢? – gsharp

+1

@gsharp這是因爲DataAnnotations不如Fluent API強大,所以在一個大型項目中,您總是需要使用Fluent API,因爲DataAnnotations不足以滿足您的需求,並且在這種情況下您最終會在兩個地方進行配置,這樣會更好在一個地方只有一個模型的所有配置。 – SOfanatic

相關問題