【问题标题】:Foreign key in two columns and navigation property两列中的外键和导航属性
【发布时间】:2014-06-24 19:37:49
【问题描述】:

我有一个名为“Team”的实体和一个名为“Match”的实体

在“Match”实体中,我想要两个属性,int HomeTeam,int AwayTeam,其中包含作为 FK 的 TeamId。

是否可以使用导航属性来获取具有此设置的特定球队的所有比赛(主场和客场比赛)?

如果是这样,那是怎么做的? 当 Id 仅在一列中时,我只使用了导航属性。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework navigation-properties


    【解决方案1】:

    你的类应该是这样的:

    public class Team
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
    public class Match
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        public virtual Team HomeTeam { get; set; }
        public virtual Team AwayTeam { get; set; }
    }
    

    你的上下文是这样的:

    public class MyEntities : DbContext
    {
        public DbSet<Team> Teams { get; set; }
        public DbSet<Match> Matches { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Team>().ToTable("Team");
            modelBuilder.Entity<Match>().ToTable("Match");
    
            modelBuilder.Entity<Match>().HasOptional(x => x.HomeTeam).WithMany().Map(m => m.MapKey("HomeTeamId"));
            modelBuilder.Entity<Match>().HasOptional(x => x.AwayTeam).WithMany().Map(m => m.MapKey("AwayTeamId"));
        }
    }
    

    基本上,您使用 Fluent API 来描述您的表和关系是如何配置的。

    编辑

    要回答您的示例查询,请获取由 Team ID 1 进行的所有比赛(主客场)的列表:

    MyEntities db = new MyEntities();
    
    List<Match> matches = db.Matches.Where(
        t => t.HomeTeam.Id == 1 || t.AwayTeam.Id == 1
    ).ToList();
    

    【讨论】:

    • 我认为 Fluent API 将在其中发挥重要作用。非常感谢!明天我会尝试并接受。
    • 一个问题,我不应该将 HomeTeamId 和 AwayTeamId 也添加到实体类吗?或者我如何在两个 TeamId 之间添加新游戏?
    • 我更喜欢保持清洁,因为您可以通过它们各自的容器实体访问Ids。我相信如果你添加一个正确填充了两个团队的新游戏,它会为你做所有事情(我爱 EF!)但一定要先测试它。如果您毕竟必须添加它们,那没什么大不了的。
    • OnModelCreating 导致身份实体出错... IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' 基于没有定义键的类型'IdentityUserLogin'。 IdentityUserRoles:EntityType:EntitySet 'IdentityUserRoles' 基于没有定义键的类型'IdentityUserRole'。
    • 当我删除 OnModelCreating 时,我可以添加迁移,但只要添加代码 sn-p,我就无法添加迁移
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2011-08-09
    • 2017-04-21
    相关资源
    最近更新 更多