我有两个表,名为Teams和Matches -我希望能够添加一个Match,它由两个团队组成,但也能够获得特定Team的所有匹配。
我能做的是:
Teams和Matches表Matches表中增加两个列,名为HomeTeam和AwayTeam,这是指Teams表中的一个团队的外键。H 214f 215我们都同意B听起来最好,因为我知道每次参加比赛的球队的确切数量--对吗?
现在,当在我的实体中声明这种关系时,我需要与Match实体有两个多对一的关系,因为Match实体有两个引用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,以获得特定团队的所有匹配。
这真的是最好的方法吗?
发布于 2011-03-08 14:58:03
B是最好的方法,因为A有点像鲱鱼。在比赛和球队之间,你并不想要很多,但你不想要他们的原因并不是因为你知道一场比赛中会有多少队,而是因为一场比赛实际上已经是团队间的许多关系了。
在这种情况下,当两个团队之间有很多到多个关系时,就称之为匹配,并且它有自己的属性集(时间、日期、位置.)。
比赛一定要有两把外键给球队,因为比赛是你的多对多的一桌。
发布于 2011-03-09 13:32:47
在关系模型中,它看起来像这样。所以两个外键是可以的,HomeTeamID和AwayTeamID被称为角色名。

发布于 2011-03-08 14:58:14
事实上,这可能是最好的方法。我认为您只是对这样一个事实有问题:您需要将两个列表连接在一起才能完成一个看似简单的查询。但是,您所使用的结构不仅仅是将两个团队关联在一起,而是提供了一个几乎分层的结构,即HomeTeam = Parent,AwayTeam = Child。
如果你想简单地把这两者联系起来,你可以像你说的那样创建多对多:
[Team]
[MatchTeam]
TeamID
MatchID
IsHomeTeam
[Match]https://stackoverflow.com/questions/5231653
复制相似问题