在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);
这只是个人喜好问题吗?
我完全同意@codenotfound答案中的所有点。但是,有一种情况(不是您的样本(,而不是偏爱问题,但是必须选择其中一个 - 单向 relatioships,即仅在一种关系中存在导航属性时。
在这种情况下,由于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);
请注意,使用正确的With
超载至关重要。例如,如果您 do 具有导航属性,并且未指定它,则EF将其映射到与常规名为FK Shadow属性的另一种单向关系。
这只是个人喜好的问题吗?
是的。这只是个人喜好的问题。
有人说:一名球员属于一个团队(这是他当前的球队(。
其他人可以说:一个团队由许多球员组成。
对于EF,这两种配置只是设置相同的内容:一对一的关系船无论您使用哪个实体开始配置。
只要他们说同一件事,只要保留其中一种配置就可以存在。