首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架生成的关系错误

实体框架生成的关系错误
EN

Stack Overflow用户
提问于 2013-02-27 00:20:37
回答 3查看 57关注 0票数 0

刚刚开始使用EF,可以说,在第一个障碍时就已经失败了。

我有两个类:

代码语言:javascript
运行
复制
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; }
}

现在,我的代码中没有任何东西可以阻止我拥有一个属于两个联盟的英雄:

代码语言:javascript
运行
复制
        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);

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

代码语言:javascript
运行
复制
 PSEUDO:
 TABLE HERO == ID,NAME,LEAGUE_ID
 TABLE LEAGUE = NAME,ID

这有效地阻止了我的职业正常工作,因为英雄现在只能成为一个联盟的成员…我怎么才能让EF拿起它呢?我猜它需要的是一种多对多的关系,但它并不是在建立一种关系。

EN

回答 3

Stack Overflow用户

发布于 2013-02-27 00:26:56

我假设你希望一个联盟中有很多英雄,但是一个英雄在很多联盟中。因此,这是一种多对多关系,要求您在它们之间有一个链接表对象,并按如下方式重新构造它(此处使用带数据注释的Code-First显示):

代码语言:javascript
运行
复制
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; }
}
票数 0
EN

Stack Overflow用户

发布于 2013-02-27 00:33:25

为了建立一个多对多的关系,你需要在英雄实体上有一个联盟集合。

代码语言:javascript
运行
复制
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; }
}
票数 0
EN

Stack Overflow用户

发布于 2013-02-27 05:16:13

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

代码语言:javascript
运行
复制
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<League>().HasMany(x => x.Team).WithMany();

        base.OnModelCreating(modelBuilder);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15094092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档