0

私の質問のタイトルはかなり単純です。私が本当に問題を抱えているのは、オブジェクトが互いにどのように関係しているか、それらの関係がデータベースにどのように格納されているかを理解することだと思います。

私はチームクラスを持っています:

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 を持つすべてのプレイヤーをロードする必要がありますか? モデルの設計は間違っていますか? 私はそれについて正しく考えていませんか?

4

1 に答える 1

1

エンティティをナビゲーション プロパティに割り当ててAdd. また、データベースに同じ名前のチームが多数あることに気付くかもしれません。

説明については、これを参照してください: Entity Framework が既存のオブジェクトをデータベースに再挿入する理由

Player にa を追加してから、次のTeamIDようにします。

var team1 = new Team { Name = "K1 White"};
context.Teams.AddOrUpdate( t => t.Name, team1);
context.Players.AddOrUpdate(
            p => p.Name,
            new Player() { Name = "Alex S", 
                           TeamID = team1.ID , Position = "LG", 
                           Number = 26 }
于 2013-10-30T15:36:17.323 に答える