使用实体框架代码首先获得来自同一个父表的两个外键,而无需指定父实体上的集合
Posted
技术标签:
【中文标题】使用实体框架代码首先获得来自同一个父表的两个外键,而无需指定父实体上的集合【英文标题】:Using Entity Framework Code First to have two Foreign Keys from same parent table without having to specify the collections on the parent entity 【发布时间】:2017-03-21 23:08:00 【问题描述】:所以我正在关注这个answer,试图让两个外键进入一个表,它可以工作。
public class Team
public int TeamId get; set;
public string Name get; set;
public virtual ICollection<Match> HomeMatches get; set;
public virtual ICollection<Match> AwayMatches get; set;
public class Match
public int MatchId get; set;
public int HomeTeamId get; set;
public int GuestTeamId get; set;
public float HomePoints get; set;
public float GuestPoints get; set;
public DateTime Date get; set;
public virtual Team HomeTeam get; set;
public virtual Team GuestTeam get; set;
public class Context : DbContext
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<Match>()
.HasRequired(m => m.HomeTeam)
.WithMany(t => t.HomeMatches)
.HasForeignKey(m => m.HomeTeamId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Match>()
.HasRequired(m => m.GuestTeam)
.WithMany(t => t.AwayMatches)
.HasForeignKey(m => m.GuestTeamId)
.WillCascadeOnDelete(false);
但是,在我的解决方案中,我不希望 Team 拥有 HomeMatches 和 AwayMatches 集合,因为能够从该实体导航到 Match 是没有意义的。
当父表的实体没有子表的集合时,是否可以有两个外键指向同一个表。
我希望我的团队实体如下所示。
public class Team
public int TeamId get; set;
public string Name get; set;
// HomeMatches and AwayMatches collection is no longer here
如何使用 modelBuilder 向 EntityFramework 表达我希望 HomeTeamID 和 GuestTeamID 成为 Team 的外键?
【问题讨论】:
所以你想要简单的导航属性?然后只需删除集合并为.WithMany()
保留空参数。您也可以使用属性 ForeignKey["ID_field_name"]
而不是 builder
@Lanorkin - 嗨,谢谢,我没有意识到你可以只通过 WithMany() 什么都没有。您应该将其添加为答案。当有两个字段都指向同一个表时,我发现 ForeignKey 属性会变得混乱。
【参考方案1】:
只需删除集合并将.WithMany()
的参数留空。
【讨论】:
以上是关于使用实体框架代码首先获得来自同一个父表的两个外键,而无需指定父实体上的集合的主要内容,如果未能解决你的问题,请参考以下文章