EF6 一对多流畅映射

EF6 One To Many Fluent Mapping

在 EF6 中,鉴于这两种方法的功能似乎相同,选择一种方法比另一种方法有什么优势吗?

modelBuilder.Entity<Player>()
            .HasRequired(p => p.CurrentTeam)
            .WithMany(t => t.Players)
            .HasForeignKey(p => p.CurrentTeamId)
            .WillCascadeOnDelete(false);

相同
modelBuilder.Entity<Team>()
            .HasMany(t => t.Players)
            .WithRequired(p => p.Team)
            .HasForeignKey(p => p.CurrentTeamId)
            .WillCascadeOnDelete(false);

这只是个人喜好问题吗?

Is this just a matter of personal preference?

是的。这只是个人喜好问题。

有人说:一个球员属于一个球队(就是他现在所在的球队)

其他人只能说:一支球队是由很多球员组成的。

对于 EF,这两个配置只是设置相同的东西:一对多关系船无论您使用哪个实体启动配置。

这两种配置可以存在,只要它们说的是同一件事,但只保留其中一种。

我完全同意@CodeNotFound 回答中的所有观点。但是有一种情况(不是你的样本),这不是偏好问题,而是必须选择其中之一 - 单向 关系,即当导航 属性 仅存在时在其中一个关系结束时。

在这种情况下,由于 EF6 Has 方法需要导航 属性 表达式,而 With 方法具有带导航和不带导航的重载 属性,您被迫开始配置来自带有导航的实体 属性(相比之下,EF Core 没有这样的要求,所以这真的是一个偏好问题)。

因此,如果您没有 collection 导航 属性,唯一的选择是:

modelBuilder.Entity<Player>()
    .HasRequired(p => p.CurrentTeam)
    .WithMany() // <--
    .HasForeignKey(p => p.CurrentTeamId)
    .WillCascadeOnDelete(false);

如果您没有参考导航 属性,则分别为:

modelBuilder.Entity<Team>()
    .HasMany(t => t.Players)
    .WithRequired() // <--
    .HasForeignKey(p => p.CurrentTeamId)
    .WillCascadeOnDelete(false);

请注意,使用正确的 With 重载至关重要。例如,如果您 do 具有导航 属性 而您未指定它,EF 会将其映射到 another 单向关系通常命名为 FK shadow 属性.