实体框架代码第一级联关系

时间:2016-04-29 12:31:41

标签: c# sql entity-framework-6

我正在尝试使用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按预期工作。

我是新手用实体框架编写第一个开发代码,所以我现在正在摸索很多并且上面的一些代码可能不是最优的。除了协助解决我的问题之外,还有任何改进建议。

理想情况下,我希望在我添加一个季节参考游戏时更新赛季,但不知道如何实现这一点,请协助。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我使用了你的模型并将其保存到本地数据库。

enter image description here

这里一切都很好(由于多对多的关系,&#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表中

相关问题