EF6一对多流畅映射

时间:2018-02-16 14:46:24

标签: c# entity-framework entity-framework-6 one-to-many ef-fluent-api

在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 个答案:

答案 0 :(得分:3)

我完全同意@CodeNotFound答案中的所有观点。但是有一个案例(不是你的样本),这不是一个偏好问题,而是必须选择其中一个 - 单向关系,即导航属性只存在于其中一个关系结束了。

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

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

With

如果您没有引用属性,则分别为:

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阴影属性的另一个单向关系。

答案 1 :(得分:1)

  

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

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

有人说:一名球员属于一支球队(这是他现在的球队)

其他人可以说:一个团队由许多玩家组成。

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

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