EF Code First Fluent API指定外键属性

44

我有一个名为AgentBalance的类,其中包含一个与Agent相关联的关联关系,如下:

public class AgentBalance
{
    ...

    public int AgentId { get; set; }

    public virtual Agent Agent { get; set; }

}

按照惯例,代理商关系的外键被检测为AgentId,但我希望在映射类中明确表示它,以便更安全地应对未来的变化。如果代理商有一个余额集合,那么我知道如何做到这一点,例如:

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

然而,代理没有余额的集合 - 我不希望该关联可逆。但是,如果在映射中没有使用 .WithMany,则无法选择指定 .HasForeignKey 选项。还有其他方法吗?(注:我知道也可以使用属性来完成此操作,但我想使用流畅的API映射。)

2个回答

69

我相信您应该能够做到这一点:

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

10
谢谢 - 我没注意到WithMany()被重载了!不过,这看起来是一种奇怪的语法。我不明白为什么他们不能让你写类似HasRequired(t => t.Agent).HasForeignKey(t => t.AgentId)的代码。 - Richard Pawson
1
EF 不会知道它是什么类型的关系。 - SOfanatic
2
这对我不起作用。除了我明确配置为外键列的AgentId之外,EF还创建了一个新的Agent_Id列。你知道这是为什么吗? - Yulian
同样,我发现每当我尝试显式设置外键时,显式迁移脚本就会完全乱掉,疯狂... - tobiak777
1
@Yukian @red2nb 这可能是因为当您在其他实体上拥有集合时,需要在 WithMany() 中指定适当的映射。例如,.WithMany(agent => agent.Balances) - David Sherret
@DavidSherret 是的,你说得对。后来我也发现了,我缺少配置!更普遍地说,我注意到大多数情况下当迁移脚本出现问题时,只是因为配置错误。 - tobiak777

1
我更喜欢使用数据注释来完成这些任务,而不是Fluent API。它更加简短易懂。 EF必须自动检测以“Id”结尾的属性,但为了安全起见,您可以明确指定它们:
using System.ComponentModel.DataAnnotations.Schema;
...
public int AgentId { get; set; }

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

如果您的外键属性名称不以 "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

10
我同意,使用数据注释更易于阅读。但在我所处的大规模复杂项目中,它不是一个好的管理方式,这是我的观点。 - Richard Pawson
@RichardPawson 为什么不? - gsharp
3
@DataAnnotations的功能不如Fluent API强大,因此在大型项目中,您始终需要使用Fluent API,因为DataAnnotations不能满足需求。当出现这种情况时,您需要在两个位置进行配置,最好将模型的所有配置放在一个地方。 - SOfanatic
@SOfanatic 同时我也同意你的观点。我一开始使用数据注释作为新手,但很快就转向了Fluent API。然而,我更喜欢从EntityTypeConfiguration继承并为每个实体创建一个配置。 - gsharp
@gsharp 是的,那是正确的方法,你甚至可能想要创建自己的“Base”类来进行EntityTypeConfiguration,这样当数据库初始化时就可以自动注册配置。 - SOfanatic
我同意语法过于复杂。应该像这样简单:Entity(ab => ab.AgentId).HasForeignKey(a => a.AgentId); - Geekn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接