У меня есть 2 таблицы с именами Teams
и Matches
- я хочу иметь возможность добавить Match
, который состоит из 2 команд, а также получить все соответствия для определенного Team
.
Что я могу сделать, это:
A) Установить отношение «многие ко многим» между таблицами Teams
и Matches
B) Создайте два дополнительных столбца в таблице Matches
с именами HomeTeam
и AwayTeam
, которые являются внешними ключами, относящимися к команде в таблице Teams
.
Мы все согласны с тем, что B звучит лучше всего, поскольку я знаю точное количество команд, которые будут участвовать в матче каждый раз - верно?
Теперь, когда дело доходит до объявления этогоотношения в моих сущностях, то мне нужно иметь 2 отношения «многие к одному» с сущностью Match
, поскольку сущность 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 для команды, чтобы получить все основныеТочки для конкретной команды ..
Это действительно лучший способ?