在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);
这只是个人偏好的问题吗?
答案 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,这两种配置只是设置相同的内容:一对多关系型船,无论您使用哪个实体来启动配置。
这两种配置可以存在,只要它们说同样的东西,但只保留其中一种。