2011-03-08 52 views
3

我有兩個表格,分別命名爲TeamsMatches - 我希望能夠添加由2個團隊組成的Match,但也能夠獲得特定Team的所有匹配。架構 - 2個外鍵到相同的主鍵?

什麼我可以做的是:

  • A)做一個多到許多TeamsMatches

  • B)請在 Matches兩個額外的列之間的關係 表名爲HomeTeamAwayTeam這是外鍵 指的是Teams中的團隊表。

我們都同意這一點聲音最好的,因爲我知道球隊的確切數額將參加比賽,每次 - 對嗎?現在

,當談到申報我的實體這種關係,那麼我就需要有2個多到一個關係到Match實體,因爲Match實體有指Team 2個外鍵 - 和正弦外鍵的數量/引用必須從兩個MatchTeam一樣,那麼我會擁有這樣的:

// Team.cs

public class Team 
{ 
    public virtual int ID { get; private set; } 
    public virtual string TeamName { get; set; } 
    public virtual Cup Cup { get; set; } 
    public virtual IList<Match> HomeMatches { get; set; } 
    public virtual IList<Match> AwayMatches { get; set; } 
    public virtual IList<Match> Matches 
    { 
     get { return HomeMatches.Concat(AwayMatches).ToList(); } 
    } 

    public Team() 
    { 
     HomeMatches = new List<Match>(); 
     AwayMatches = new List<Match>(); 
    } 
} 

public class TeamMap : ClassMap<Team> 
{ 
    public TeamMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.TeamName).Not.Nullable(); 
     References(x => x.Cup, "CupID"); 
     HasMany(x => x.HomeMatches).KeyColumn("HomeTeamID").Inverse().Cascade.AllDeleteOrphan(); 
     HasMany(x => x.AwayMatches).KeyColumn("AwayTeamID").Inverse().Cascade.AllDeleteOrphan(); 

     Table("Teams"); 
    } 
} 

// Match.cs

public class Match 
{ 
    public virtual int ID { get; private set; } 
    public virtual Team HomeTeam { get; set; } 
    public virtual Team AwayTeam { get; set; } 
    public virtual int WinnerID { get; set; } 
    public virtual Cup Cup { get; set; } 
} 

public class MatchMap : ClassMap<Match> 
{ 
    public MatchMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.WinnerID); 
     References(x => x.HomeTeam, "HomeTeamID"); 
     References(x => x.AwayTeam, "AwayTeamID"); 
     References(x => x.Cup, "CupID"); 

     Table("Matches"); 
    } 
} 

由於代碼顯示,那麼我將不得不使用.Concat()合併HomeMatches和AwayMatches對於一個團隊,讓所有的比賽爲特定團隊..

這真的是最好的方式?

回答

3

B是最好的方式去,因爲A是一個紅鯡魚的位。在比賽和球隊之間你並不是真的想要很多桌子,但是你不想要他們的原因並不是因爲你知道比賽中的球隊數量,而是因爲比賽實際上是多對多已經有團隊合作的關係。

只是在這種情況下,當兩個團隊之間有多對多的關係時,您稱它爲匹配,並且它擁有自己的一組屬性(時間,日期,位置等)。

比賽應該一定有兩個外鍵隊,因爲比賽是你的多桌。

1

這實際上可能是最好的選擇。我認爲你只是有一個問題,因爲你需要將兩個列表結合在一起來拉取看似簡單的查詢。但是,您使用的結構不僅僅是關聯兩個團隊,它還提供了一個幾乎分層的結構,即HomeTeam = Parent,AwayTeam = Child。

如果你想簡單地將兩個,您可以創建多到許多像你說:

[Team] 

[MatchTeam] 
TeamID 
MatchID 
IsHomeTeam 

[Match] 
+0

這就是我的想法太開始......但我發現錯了有一個多一對多的關係時,只有2支球隊可以參加比賽 - 與一個多TO-許多我需要重新發明輪子,並找出如何處理這種情況... – ebb 2011-03-08 15:07:37

+0

確切地說,這就是爲什麼我認爲你已經有「最好」的方式顯示。 – Keith 2011-03-08 15:24:18

+0

我猜我的球迷是否.Concat()是一個性能缺陷,當我必須合併主隊和客隊比賽時,球隊已經玩了。 – ebb 2011-03-08 15:57:53

2

在關係模型,它會是這個樣子。所以兩個外鍵是好的,HomeTeamIDAwayTeamID就是所謂的角色名稱

enter image description here