2016-04-29 19 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テーブルが作成されます。

チームとシーズンを含み、チームがゲームで更新されている間にSeasonTeamsテーブルが更新されず、その結果、シーズンからすべてのチームを取得しようとすると何も返されません。すなわち、

次のコードは、通常、上記の使用方法ですが、結果は表示されません。 Season.Gamesの

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

他のクエリ、Team.Games & Team.Season作業は予想通り。

私はエンティティフレームワークで最初の開発を行うのが初めてです。そのため、現時点で多くの不安を抱えており、上記のコードのいくつかはおそらく最適ではありません。私の問題の支援に加え、改善のための提案は歓迎します。

シーズンを参照してゲームを追加すると理想的には、シーズンを更新したいと思いますが、これを達成する方法がわからない場合は、お手伝いください。

ありがとうございます。

+0

私はちょうどdでは、多対多の関係はEFではサポートされていません。私はこれが私のコードが動作しない理由であると思われる。 – Craig

+0

Game.Season SetプロパティとGame.HomeTeam&Game.AwayTeam Setプロパティのチェックを追加して、チームがSeason.Teamsコレクションに存在するかどうかをチェックして追加します't。私はこれが非常にエレガントな解決策であると確信していない。多くの関係EFコードで可能である第一=> modelBuilder.Entity () .HasMany (S => s.Contacts)に多く – Craig

+0

.WithMany(C => c.Customers) .MAP (cs => { cs.MapLeftKey( "CustomerId"); cs。MapRightKey( "ContactId"); cs.ToTable( "CustomersContacts"); }); – Alegrowin

答えて

1

あなたのモデルを使用して、それをローカルDBに保存しました。

:私はあなたがこれに似た何かをやっている理解し、あなたのシナリオから

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テーブルに追加されます

関連する問題