2016-04-29 41 views
0

我想创建一个使用实体框架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表。

当一个包括球队和赛季在内的球队加入比赛时,赛季球队表不会更新,因此,当我尝试从一个赛季中获得所有球队时,什么都不会返回。即。

下面的代码通常是我如何使用上述,但是,没有给出结果。如预期

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 & Team.Season工作。

我是第一次使用实体框架进行代码开发的新手,因此现在摸索了很多,上面的一些代码可能不是最优的。欢迎任何有关改进的建议,以及对我的问题的帮助。

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

预先感谢您。

+0

我刚才d EF不支持多对多关系。我怀疑这就是为什么我的代码不起作用。 – Craig

+0

我有种解决了这个问题,在Game.Season Set属性中添加了一个检查,并且在Game.HomeTeam&Game.AwayTeam Set属性中检查了Season.Teams集合中是否存在团队并添加它,如果它没有“T。我不相信这是一个非常优雅的解决方案。 – Craig

+0

多对多的关系是可能的EF代码第一=> modelBuilder.Entity () .HasMany (S => s.Contacts) .WithMany(C => c.Customers) .MAP (cs => {c .MapLeftKey(“CustomerId”); cs。MapRightKey( “使用ContactID”); cs.ToTable(“CustomersContacts”); }); – Alegrowin

回答

1

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

enter image description here

一切都很好,在这里(以下简称“SeasonTeams”表是不可见的,由于多对多的关系)

从你的情况我知道你正在做类似这样:

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); 
    } 
} 

请注意,使用此功能会自动将新创建的团队添加到团队表格和SeasonTeams表格