2013-02-26 62 views
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選擇這個呢?我猜它需要的是多對多的關係,但它不是建設一個..

回答

0

我認爲你想要一個聯盟有許多英雄,但一個英雄在許多聯賽。因此,這是一個多一對多的關係,不需要你有他們之間的聯繫表對象,並重組其如下(這裏顯示使用代碼優先與數據註釋):

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

爲了做一個多對多的關係,你需要在英雄實體上有一個聯盟集合。

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

這正確地修正了模型。謝謝 - 我很驚訝,我必須這樣做,但是當我給它多一點思考時,我認爲它是有道理的,否則所有關係在默認情況下都必須是多對多的:S – 2013-02-26 16:40:21

+0

如果它幫助解決您的問題,請標記它已經回答。 – NunoCarmo 2013-02-26 16:46:13

0

這可以通過配置來實現,如果你不想在你的英雄課堂上定義一個集合。

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

     base.OnModelCreating(modelBuilder); 
    }