0

刚开始使用 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);

但是,当我从包管理器运行“更新数据库”时,它会使用英雄上的外键生成我的数据库 - 这实际上意味着我的英雄只能是 1 个联盟的成员:

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

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

4

3 回答 3

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; }
}
于 2013-02-26T16:33:25.050 回答
0

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

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

        base.OnModelCreating(modelBuilder);
    }
于 2013-02-26T21:16:12.603 回答
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; }
}
于 2013-02-26T16:26:55.710 回答