0

EFを使い始めたばかりで、いわば最初のハードルに落ち込んでいます。

私は2つのクラスを持っています:

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; }
}

今、私のコードには、2つのリーグのメンバーであるヒーローがいるのを止めるものは何もありません。

        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」を実行すると、ヒーローの外部キーを使用してDBが生成されます。つまり、ヒーローは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 に答える