我正在制作梦幻足球游戏,我正在使用Entity Framework来映射我的数据库。
有一个表格,其中包含所有可能的足球运动员,称为球员,一个包含称为球队的球队信息的表格,一个包含联赛信息的表格,一个表格记录哪个球员属于哪个球队(因为一个球员属于哪个球员)许多球队取决于他们所在的联赛)称为联盟球员。
然而,当我试图从团队中获得所有玩家时,我遇到了一个问题。当我从我的上下文中进行查询时,玩家显示为null,而如果我查看ID并且在数据库中,所有信息都在那里。有谁知道是什么原因造成的?我是否错误地设置了模型?
查询
public async Task<IActionResult> getTeamPlayers(){
// Null values
var y = await context.Teams.Include(s => s.Players)
.SingleOrDefaultAsync(t => t.ManagerID == manager.ManagerID);
// Also null values
var z = await context.Leagues.Include(l => l.Teams)
.ThenInclude(t => t.Players)
.AsNoTracking()
.ToListAsync();
return Json(y);
}
调试
模特
public class Team{
[Key]
public int TeamID { get; set; }
public int ManagerID { get; set; }
public int LeagueID { get; set; }
public string TeamName { get; set; }
public virtual Manager Manager { get; set; }
public virtual League League { get; set; }
public virtual ICollection<LeaguePlayer> Players { get; set; }
}
public class Player {
[Key]
public int PlayerID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Postion { get; set; }
}
public class LeaguePlayer{
[Key]
public int LeaguePlayerID { get; set; }
[ForeignKey("Player")]
public int PlayerID { get; set; }
[ForeignKey("Team")]
public int TeamID { get; set; }
[ForeignKey("League")]
public int LeagueID { get; set; }
public virtual Player Player { get; set; }
public virtual Team Team { get; set; }
public virtual League League { get; set; }
}
public class League{
[Key]
public int LeagueID { get; set; }
public int CommissionerID { get; set; }
public string LeagueName { get; set; }
[ForeignKey("CommissionerID")]
public virtual Manager Commisoner {get; set;}
public virtual ICollection<Team> Teams { get; set; }
}
答案 0 :(得分:3)
Personnaly我认为这就是你想要的:
但在这里我看到了:
球员属于球队还是联盟?如果两者都比你想象的要复杂得多,那将会是一个多对多的三倍
好的,最后在确切知道你想要什么之后,会有2个“多对多”,一个“一对多”
AND! 你将手动验证一名球员不属于同一联赛中的两支不同球队。
所以,在这里制作2个交叉点表,这很难理解,但如果你想在其他联赛中不会出现的联赛中的“自由球员”,那么这是唯一的出路
答案 1 :(得分:0)
由于延迟加载(使用虚拟关键字),实体不会加载已经使用的数据。如果我先打电话给联盟,数据就会被加载。通过编辑查询以包含需要使用的数据,数据显示出来。
var x = await context.Teams
.Include(t => t.League)
.Include(t => t.Players)
.ThenInclude(p => p.Player)
.ToListAsync();