2013-10-14 127 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

相关问题