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 属性.
在 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 属性.