[英]NHibernate + Multiple foreign keys to same column
我正在尝试通过使用以下映射来映射我的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])必须与引用的主键(Teams [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()对我来说似乎有点讨厌。
我不知道为什么,但是我觉得我之前已经回答了这个确切的问题...
您正在看到的错误正在发生,因为您正在基于复合反向键创建关联,该反向键将无法映射到单个外键。
一种解决方案是尝试将您的“理想”关系模型引入对象模型,或者,也可以丰富您的模型。 我建议您使用丰富的模型来表示比赛中的队伍,您可以将其称为“ Participation
。 这将为您提供团队与比赛之间的多对多关系。
不利的一面是您需要将关系的基数表示为业务规则(因此,您不能让三支球队参加同一场比赛)。
这样做的好处是您可以在参与人员上标记一个胜利者是谁,这样您就不需要在对象模型上有一个WinnerId
字段。
您最终会得到如下使用的代码:
var match = new Match();
match.AddTeam(team1);
match.AddTeam(team2);
var winner = match.Participants.FindWinner();
winner = match.Winner; // alias for the above
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.