我有两个表,分别是名为
我可以做以下两件事中的一件:
A) 在
B) 在
我们都同意选项B听起来最好,因为我知道每次参加比赛的团队数量。
现在,当涉及到在我的实体中声明这种关系时,我需要有两个对
// Team.cs
Teams
和Matches
的表。我想要添加一个由2个团队组成的Match
,同时也能够获取特定Team
的所有比赛。我可以做以下两件事中的一件:
A) 在
Teams
和Matches
表之间建立多对多关系B) 在
Matches
表中创建两个额外的列HomeTeam
和AwayTeam
,它们是指向Teams
表中团队的外键。我们都同意选项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,以获取该特定球队的所有比赛。
这真的是最好的方法吗?