私の質問のタイトルはかなり単純です。私が本当に問題を抱えているのは、オブジェクトが互いにどのように関係しているか、それらの関係がデータベースにどのように格納されているかを理解することだと思います。
私はチームクラスを持っています:
public class Team
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual IEnumerable<Player> Players { get; set; }
}
そして Player クラス
public class Player
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual int Number { get; set; }
public virtual string Position { get; set; }
public virtual Team Team { get; set; }
}
マイ データ ソース インターフェイス
public interface ITeamDataSource
{
IQueryable<Team> Teams { get; }
IQueryable<Player> Players { get; }
IQueryable<Coach> Coaches { get; }
}
そして、DbContext と ITeamDataSource から継承する私の DataContext
public class TeamDB : DbContext, ITeamDataSource
{
public TeamDB()
: base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = false;
}
public DbSet<Team> Teams { get; set; }
public DbSet<Player> Players { get; set; }
public DbSet<Coach> Coaches { get; set; }
IQueryable<Team> ITeamDataSource.Teams
{
get { return Teams; }
}
IQueryable<Player> ITeamDataSource.Players
{
get { return Players; }
}
IQueryable<Coach> ITeamDataSource.Coaches
{
get { return Coaches; }
}
}
私の Seed メソッドでは、プレーヤーのリストを持ついくつかのチームを実装しようとしています
context.Teams.AddOrUpdate( t => t.Name,
new Team { Name = "K1 White"},
new Team { Name = "K1 Blue" },
new Team { Name = "2nd Grade White" },
new Team { Name = "2nd Grade Blue" },
new Team { Name = "3rd Grade White" },
new Team { Name = "3rd Grade Blue" },
new Team { Name = "4th Grade White" },
new Team { Name = "4th Grade Blue" }
);
context.SaveChanges();
Team K1White = (Team)context.Teams.Where(t => t.Name == "K1 White").First();
context.Players.AddOrUpdate(
p => p.Name,
new Player() { Name = "Alex S", Team = K1White, Position = "LG", Number = 26 },
new Player() { Name = "Carson B", Team = K1White, Position = "RT", Number = 11 },
new Player() { Name = "Colton B", Team = K1White, Position = "SUB", Number = 10 },
new Player() { Name = "Christian H", Team = K1White, Position = "QB", Number = 17 },
new Player() { Name = "Xander D", Team = K1White, Position = "RB", Number = 00 },
new Player() { Name = "Zak B", Team = K1White, Position = "RB", Number = 15 },
new Player() { Name = "Logan A", Team = K1White, Position = "RB", Number = 14 },
new Player() { Name = "Solomon R", Team = K1White, Position = "TE", Number = 44 },
new Player() { Name = "Wyatt G", Team = K1White, Position = "RT", Number = 99 },
new Player() { Name = "Nick K", Team = K1White, Position = "C", Number = 98 },
new Player() { Name = "Carson M", Team = K1White, Position = "RG", Number = 97},
new Player() { Name = "Carson H", Team = K1White, Position = "TE", Number = 96 }
);
context.SaveChanges();
私のコントローラーでは、すべてのチームを取得してビューを返すだけです
public ActionResult Index()
{
var allTeams = _db.Teams;
return View(allTeams);
}
私の見解では、チームのリストを作成しようとしているだけで、各チームにはプレーヤーのリストがあります
@model IEnumerable<TeamManagement.Models.Team>
<ul>
@foreach (var team in Model)
{
<li>@team.Name</li>
<ul>
@foreach (var player in team.Players)
{
<li>@player.Name | Position: @player.Position | Number: @player.Number</li>
}
</ul>
}
</ul>
これを実行すると、null であるため、チーム オブジェクトのプレーヤーを反復処理しようとすると失敗します。
私の質問は基本的にこれに帰着します:これを処理する正しい方法は何ですか?
私はデータベースで多くの作業を行ったことがなく、EF CF の開発もあまり行っていません。コントローラー内のチームの ID と一致するチーム ID を持つすべてのプレイヤーをロードする必要がありますか? モデルの設計は間違っていますか? 私はそれについて正しく考えていませんか?