我有两个表格,分别命名为Teams
和Matches
- 我希望能够添加由2个团队组成的Match
,但也能够获得特定Team
的所有匹配。架构 - 2个外键到相同的主键?
什么我可以做的是:
A)做一个多到许多
Teams
和Matches
表B)请在
Matches
两个额外的列之间的关系 表名为HomeTeam
和AwayTeam
这是外键 指的是Teams
中的团队表。
我们都同意这一点乙声音最好的,因为我知道球队的确切数额将参加比赛,每次 - 对吗?现在
,当谈到申报我的实体这种关系,那么我就需要有2个多到一个关系到Match
实体,因为Match
实体有指Team
2个外键 - 和正弦外键的数量/引用必须从两个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对于一个团队,让所有的比赛为特定团队..
这真的是最好的方式?
这就是我的想法太开始......但我发现错了有一个多一对多的关系时,只有2支球队可以参加比赛 - 与一个多TO-许多我需要重新发明轮子,并找出如何处理这种情况... – ebb 2011-03-08 15:07:37
确切地说,这就是为什么我认为你已经有“最好”的方式显示。 – Keith 2011-03-08 15:24:18
我猜我的球迷是否.Concat()是一个性能缺陷,当我必须合并主队和客队比赛时,球队已经玩了。 – ebb 2011-03-08 15:57:53