代码之家  ›  专栏  ›  技术社区  ›  Joe

EF6一对多Fluent映射

  •  2
  • Joe  · 技术社区  · 6 年前

    在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);
    

    这只是个人喜好的问题吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Ivan Stoev    6 年前

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

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

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

    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);
    

    请注意,使用正确的 具有 超载。例如,如果您 如果您没有指定导航属性,EF会将其映射到 另一个 具有常规命名的FK阴影特性的单向关系。

        2
  •  1
  •   CodeNotFound dotnetstep    6 年前

    这只是个人喜好的问题吗?

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

    有人说: 一名球员属于一支球队(即他目前所在的球队) .

    其他人只能说: 一个队由许多队员组成。

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

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