实体框架 - 生成的关系是错误的

时间:2013-02-26 16:20:37

标签: entity-framework

刚刚开始使用EF并且在第一道障碍时就已经摔倒了。

我有两节课:

public class Hero
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class League
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Hero> Team { get; set; }
}

现在我的代码中没有任何内容可以阻止我拥有一个两个联盟成员的英雄:

        League A = new League() { Name = "A Team" };
        League B = new League() { Name = "B Team" };
        Hero me = new Hero() { Name = "Richard" };

        A.Team = new List<Hero>();
        A.Team.Add(me);

        B.Team = new List<Hero>();
        B.Team.Add(me);

然而,当我从包管理器运行“Update-Database”时,它会生成我的数据库,其中包含英雄上的外键 - 有效意味着我的英雄只能是1个联盟的成员:

 PSEUDO:
 TABLE HERO == ID,NAME,LEAGUE_ID
 TABLE LEAGUE = NAME,ID

这实际上阻止了我的课程正常工作,因为英雄现在只能成为1个联盟的成员......我怎样才能让EF选择这个?我想它需要的是多对多的关系,但它不是建立一个......

3 个答案:

答案 0 :(得分:0)

我认为你想要一个联盟有很多英雄,但是英雄要在很多联盟中。因此,这是一个多对多关系,要求您在它们之间有一个链接表对象,并按如下所示进行重组(此处显示使用带有数据注释的Code-First):

public class Hero
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<HeroLeagueLink> Leagues { get; set; }
}

public class League
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<HeroLeagueLink> Team { get; set; }
}

public class HeroLeagueLink
{
   [Key, Column(Order = 0), ForeignKey("Hero")]
   public virtual int HeroID { get; set; }
   [Key, Column(Order = 1), ForeignKey("League")]
   public virtual int LeagueID { get; set; }

   public virtual Hero Hero { get; set; }
   public virtual League League { get; set; }
}

答案 1 :(得分:0)

为了做多对多的关系,你需要在英雄实体上加入联盟。

public class Hero
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<League> Leagues { get; set; }
}

public class League
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Hero> Team { get; set; }
}

答案 2 :(得分:0)

这可以通过配置来实现,以防你不想在你的英雄类上定义一个集合。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<League>().HasMany(x => x.Team).WithMany();

        base.OnModelCreating(modelBuilder);
    }