C# EF6一对多Fluent映射
在EF6中,鉴于这两种方法的功能似乎相同,选择一种方法比另一种方法有什么优势吗C# EF6一对多Fluent映射,c#,entity-framework,entity-framework-6,one-to-many,ef-fluent-api,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(
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);
这只是个人喜好的问题吗
这只是个人喜好的问题吗
是的。这只是个人喜好的问题
有人说:一个球员属于一支球队,这是他现在的球队
其他人只能说:一支球队是由许多球员组成的
对于EF,这两种配置只是设置了相同的东西:一对多关系ship,不管您使用哪个实体启动配置
这两种配置可以存在,只要它们说的是相同的话,但只保留其中一种 我完全同意@CodeNotFound-answer的所有观点。但有一种情况不是您的样本,它不是偏好的问题,而是必须选择其中一种-单向关系,即当导航属性仅存在于其中一个关系中时 在这种情况下,由于EF6具有方法require navigation属性表达式,而With方法具有重载(带或不带navigation属性),因此您必须从具有navigation属性的实体开始配置。相反,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 shadow属性的单向关系。谢谢-了解这一点非常有帮助。