2011-03-07 55 views
1

我試圖映射我TeamMatch表使用以下映射:的NHibernate +多個外鍵同一列

// 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> Matches { get; set; } 

    public Team() 
    { 
     Matches = 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.Matches) 
      .Key(x => x.Columns.Add("Team1ID", "Team2ID")) 
      .Inverse().Cascade.AllDeleteOrphan(); 

     Table("Teams"); 
    } 
} 

// Match.cs

public class Match 
{ 
    public virtual int ID { get; private set; } 
    public virtual Team Team1 { get; set; } 
    public virtual Team Team2 { 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.Team1, "Team1ID"); 
     References(x => x.Team2, "Team2ID"); 
     References(x => x.Cup, "CupID"); 
     Table("Matches"); 
    } 
} 

然而,它拋出,上面寫着一個例外:

外鍵 (FKEFFCA4CA45169AED:匹配[Team1ID, Team2ID]))必須具有相同數目的 列作爲引用的主鍵 (隊[ID])

任何建議?

UPDATE:

我能夠通過混合基於註釋的東西來解決它寫的@Yads。

我的代碼:

// 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()似乎有點討厭我......

+1

見http://stackoverflow.com/questions/3571068/nhibernate-map-multiple-columns-into-a-single -collection – Vadim 2011-03-07 20:20:57

回答

0

我不知道爲什麼,但我覺得我已經回答了這個EXAC牛逼問題之前......

你看到正在發生,因爲你正在創建基於複合逆關鍵,這將不能夠被映射到一個單一的外鍵關聯的錯誤。

一個解決辦法是嘗試硬塞進你的「理想」的關係模型到對象模型,或者,或者你可以豐富你的模型。我建議有一個豐富的模型來表達一個球隊打比賽,你可以稱它爲Participation。這會給你一個團隊和比賽之間的多對多關係。

這樣做的缺點是,你將需要表達爲業務規則(所以你不能有三支球隊在同一場比賽打)的關係的基數。

好處是你可以有一個參與標誌,說誰是贏家,所以你不需要在你的對象模型上有一個WinnerId字段。

你想最終代碼會像這樣使用:

var match = new Match(); 
match.AddTeam(team1); 
match.AddTeam(team2); 

var winner = match.Participants.FindWinner(); 
winner = match.Winner; // alias for the above 
+0

@jonnii - 這是完全一樣的方法,我想出了在起步! - 不過,我發現這是錯誤的有Teams'和'Matches'之間'一個多一對多的關係,因爲我知道,總會有隻有2隊進行匹配。我用@Cade Roux來解釋這個問題=> http://stackoverflow.com/questions/5194433/sql-design-database-to-reflect-tournament-design – ebb 2011-03-07 20:53:57

+0

它更加靈活,沒有什麼能阻止你讓三個團隊進入在數據庫中進行匹配,但該模型更豐富且更具表現力。它還會簡化您的查詢,例如想象一下查詢「今年參加過3場比賽的球隊」。您建議的模型本身並不安全,需要驗證,例如Team1和Team2不能相同,而WinnerId需要是Team1Id或Team2Id之一。我寧願選擇基數痛苦。 – jonnii 2011-03-07 20:56:25

+0

@jonnii - 我可以很容易地找出誰今年打了3場比賽:'cupEntity.Teams.Where(x => x.Matches.Date == somedata);' - 另見我更新的帖子...我想通了如何讓它在沒有多對多的情況下工作,但是我並沒有完全意識到這樣做的缺點.. – ebb 2011-03-07 21:25:07

相關問題