使用实体框架代码首先获得来自同一个父表的两个外键,而无需指定父实体上的集合

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() 的参数留空。

【讨论】:

以上是关于使用实体框架代码首先获得来自同一个父表的两个外键,而无需指定父实体上的集合的主要内容,如果未能解决你的问题,请参考以下文章

Mysql的外键

理解实体框架核心外键关系

实体框架存在部分自动生成的复合键问题

无法从实体框架的引用表中检索数据

Oracle外键需要建索引吗?

MySQL外键约束-foreign key