Я пытаюсь сопоставить свою таблицу Team
и Match
, используя следующие сопоставления:
// 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> Matches { get; set; }
public Team()
{
Matches = 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.Matches)
.Key(x => x.Columns.Add("Team1ID", "Team2ID"))
.Inverse().Cascade.AllDeleteOrphan();
Table("Teams");
}
}
// Match.cs
public class Match
{
public virtual int ID { get; private set; }
public virtual Team Team1 { get; set; }
public virtual Team Team2 { 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.Team1, "Team1ID");
References(x => x.Team2, "Team2ID");
References(x => x.Cup, "CupID");
Table("Matches");
}
}
Однако выдается исключение, которое говорит:
Внешний ключ (FKEFFCA4CA45169AED: Matches [Team1ID, Team2ID])) должен иметь такое же количество столбцов, что и первичный ключ, на который есть ссылкаКоманды [ID])
Есть предложения?
ОБНОВЛЕНИЕ:
Мне удалось решить эту проблему, смешав что-то на основекомментарий написал @ Yads.
Мой код:
// 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 () немного неприятен ...