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

时间:2014-05-20 15:05:51

标签: c# entity-framework ef-code-first ef-migrations

我试图建立双重关系。让我们说它的团队和球员 - 一支球队有很多球员,但只有一名队长

    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语句与FOREIGN KEY约束冲突&#34; FK_dbo.Teams_dbo.Players_TeamId&#34;。冲突发生在数据库&#34; dev&#34;,table&#34; dbo.Players&#34;,column&#39; Id&#39;中。 (我正在翻译我的真正的类名/字段)

1 个答案:

答案 0 :(得分:1)

使用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-&gt; Captain关系被视为多对一关系。据推测,一个特定的球员不能成为一支以上球队的队长,但由于球队与球员之间的关系是一对多的,所以一个特定的球员无论如何都不在一支以上的球队,应该很容易确保通过你的UI,一个团队的队长也是该团队的一名球员,因此一个特定的球员只能成为一支球队的队长。