EF6同一实体之间的一对多和多对一

本文关键字:一对多 多对一 之间 实体 EF6 | 更新日期: 2023-09-27 18:04:28

我正在尝试创建一个双重关系。假设这是一个球队和球员——一个球队有很多球员,但只有一个队长

    public class Team
    {
        public int Id { get; set; }
        public virtual ICollection<Player> Players { get; set; }
        public Player Captain { get; set; }
        public int CaptainId { get; set; }
    }

    public class Player
    {
        public int Id { get; set; }
        public string Name { get; set; }
        [InverseProperty("Players")]
        public virtual Team Team { get; set; }
        public int TeamId { get; set; }
    }

当运行update-database时,会导致如下错误ALTER TABLE语句与外键约束FK_dbo.Teams_dbo.Players_TeamId冲突。冲突发生在数据库"dev",表"dbo "。玩家",列"Id"。(我从我真实的类名/字段翻译)

EF6同一实体之间的一对多和多对一

使用Fluent API明确地描述您的实体关系。

modelBuilder.Entity<Team>().HasMany(t => t.Players).WithRequired(p => p.Team).HasForeignKey(p => p.TeamId);
modelBuilder.Entity<Team>().HasRequired(t => t.Captain).WithMany().HasForeignKey(t => t.CaptainId);

您可以在上面看到Team->Captain关系被视为多对一关系。假设一个给定的球员不能担任多个球队的队长,但由于球队->球员关系是一对多的,一个给定的球员不会在多个球队,无论如何,你应该很容易通过你的UI确保一个球队的队长也是该球队的球员,因此一个给定的球员将只担任一个球队的队长。