我正在尝试使用Entity框架6和SQL Ce数据库创建代码优先方法。当我创建一个主客场球队和一个赛季的比赛时,球队会更新比赛,但赛季不是。
赛季由许多球队和许多比赛组成。
一支球队在很多联赛赛季都会参加很多比赛。
比赛是联盟赛季的一部分,有主队和客队。
public class Season {
public int ID { get; private set; }
public ICollection<Team> Teams;
public ICollection<Game> Games;
}
public class Team {
public int ID { get; private set; }
public string Name {get;set;}
public ICollection<Game> Games;
public ICollection<Season> Seasons;
}
public class Game {
public int ID { get; private set; }
public Season Season;
public Team HomeTeam;
public Team AwayTeam;
}
public class SeasonConfiguration : EntityTypeConfiguration<Season> {
public SeasonConfiguration() {
HasKey(s => s.ID);
HasMany(g => g.Games).WithOptional(s => s.Season);
//I've read that this should work for a many-to-many relationship, but it doesn't seem to work here!
HasMany(t => t.Teams).WithMany(p => p.Seasons).Map(x =>
{
x.MapLeftKey("TeamID");
x.MapRightKey("SeasonID");
x.ToTable("SeasonTeams");
});
}
public class TeamConfiguration : EntityTypeConfiguration<Team> {
public TeamConfiguration() {
HasKey(t => t.ID);
HasMany(g => g.Games).WithOptional(t => t.AwayTeam).Map(m => m.MapKey("AwayTeamID"));
HasMany(g => g.Games).WithOptional(t => t.HomeTeam).Map(m => m.MapKey("HomeTeamID"));
}
public class GameConfiguration : EntityTypeConfiguration<Game> {
public GameConfiguration() {
HasKey(a => a.ID);
HasOptional(s => s.Season).WithMany(g => g.Games).Map(m => m.MapKey("SeasonID"));
HasOptional(t => t.HomeTeam).WithMany().Map(m => m.MapKey("HomeTeamID"));
HasOptional(t => t.AwayTeam).WithMany().Map(m => m.MapKey("AwayTeamID"));
}
}
运行应用程序并使用种子值创建数据库时,它会创建一个包含SeasonID和TeamID的SeasonTeams表。
当添加游戏时,包括团队和季节,当团队更新游戏时,SeasonTeams表不会更新,因此,当我尝试从一个赛季中获得所有球队时,不会返回任何内容。即
以下代码通常是我如何使用上述代码,但是没有给出结果。
Season season2016 = new Season("2016");
Game game = new Game {HomeTeam= "Leicester City", AwayTeam="Arsenal", Season=season2016};
context.SaveChanges();
Season season = GetSeason();
foreach(Team team in season.Teams) {
Console.WriteLine(team.Name);
}
Season.Games,Team.Games&amp; Team.Season按预期工作。
我是新手用实体框架编写第一个开发代码,所以我现在正在摸索很多并且上面的一些代码可能不是最优的。除了协助解决我的问题之外,还有任何改进建议。
理想情况下,我希望在我添加一个季节参考游戏时更新赛季,但不知道如何实现这一点,请协助。
提前谢谢。
答案 0 :(得分:1)
我使用了你的模型并将其保存到本地数据库。
这里一切都很好(由于多对多的关系,&#39; SeasonTeams&#39;表格不可见)
从您的情景中我了解到您正在做类似的事情:
using (var sportContext = new Sport())
{
var season2016 = sportContext.Seasons.First();
var homeTeam = sportContext.Teams.Where(w => w.Name == "Leicester City").First();
var awayTeam = sportContext.Teams.Where(w => w.Name == "Arsenal").First();
Game game = new Game { HomeTeam = homeTeam , AwayTeam = awayTeam, Season = season2016 };
//Populate the SeasonTeams Table
var teamList = season2016.Teams.ToList();
teamList.Add(homeTeam);
teamList.Add(awayTeam);
season2016.Teams = (teamList);
sportContext.Games.Add(game);
sportContext.SaveChanges();
var season = sportContext.Seasons.First();
var seasons = sportContext.Entry(season).Collection(c => c.Teams).Query();
foreach (Team team in seasons)
{
Console.WriteLine(team.Name);
}
}
请注意,使用此功能会自动将新创建的Team添加到Teams表和SeasonTeams表中