【发布时间】:2011-07-11 00:57:18
【问题描述】:
我有 2 个表,分别命名为 Teams 和 Matches - 我希望能够添加一个由 2 个团队组成的 Match,但也能够获取特定 @987654324 的所有匹配项@。
我能做的是:
A) 建立多对多关系 在
Teams和Matches之间 表B) 在
Matches名为HomeTeam的表和AwayTeam这是外键 指Teams中的团队 表。
我们都同意 B 听起来最好,因为我知道每次参加比赛的确切队伍数量 - 对吧?
现在在我的实体中声明这种关系时,我需要与 Match 实体建立 2 个多对一关系,因为 Match 实体有 2 个外键,它们指向Team - 并且正弦外键/引用的数量必须与Match 和Team 相同,然后我会得到这样的结果:
// 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,以获得特定球队的所有比赛..
这真的是最好的方法吗?
【问题讨论】:
标签: sql database nhibernate database-design architecture