3

私は、エンティティフレームワークを使用してバドミントンリーグのスコアを追跡する単純なMVCアプリケーションに取り組んでいます。次の2つのクラスがあります。

public class Game
{
    public int Id { get; set; }
    public Player Player1 { get; set; }
    public Player Player2 { get; set; }
    public int Player1Score { get; set; }
    public int Player2Score { get; set; }
}

public class Player
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public List<Game> Games { get; set; }
}

私が抱えている問題は、Gamesプロパティが空のリストを返すプレーヤーのインスタンスがある場合です。プレーヤーのリストをリクエストするときは、次のものを使用します。-

var players = badmintonDB.Players.Include("Games").ToList();

SOでの検索から、をオーバーライドしようとしましたOnModelCreating。を使用した場合と使用しない場合で、次のことを試しましたMap()。これにより、データベースに別のテーブルが作成されますが、レコードは含まれていません。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Player>().HasMany(p => p.Games).WithMany()
            .Map(m =>
            {
                m.ToTable("PlayerGames");
                m.MapLeftKey("Player_Id");
                m.MapRightKey("Game_Id");
            });

        base.OnModelCreating(modelBuilder);

    }

POCOの設計を再考する必要があるのか​​、オーバーライドするときに構文が間違っているのか、どこが間違っているのかわかりませんOnModelCreating

どんな助けでもいただければ幸いです。

4

4 に答える 4

2

そのデザインがあなたが望むように機能するかどうかはわかりません。プレーヤーを次のようなゲームに結び付けるために、新しい「スコア」エンティティを作成した場合はどうなりますか。

public class Game
{
    public int Id { get; set; }
    public virtual ICollection<Score> Scores { get; set; }
}

public class Player
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public virtual ICollection<Score> Scores { get; set; }
}

public class Score
{
    public int ScoreId { get; set; }
    public virtual  Player Player { get; set; }
    public virtual Game Game { get; set; }
    public int Score { get; set; }
}
于 2013-01-22T17:56:12.113 に答える
1

更新:
それについてもう少し考えてみると、これが自動ナビゲーションプロパティで実行できるかどうかはわかりません。理由は次のとおりです。に2つの外部キーがありGameます。したがって、プレーヤーがゲームのリストをロードするには、EFは2つの外部キーで選択を作成する必要があります。

古い答え(私は今間違っていると思います):
EFはナビゲーションプロパティを自動検出しようとします。たぶんこれGameは2つあるので失敗しますPlayer

ナビゲーションを自分で宣言します。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder
         .Entity<Game>()
         .HasRequired(g => g.Player1)
         .WithMany()
         .WillCascadeOnDelete(false);

        modelBuilder
         .Entity<Game>()
         .HasRequired(g => g.Player2)
         .WithMany()
         .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);

    }
于 2013-01-22T13:35:56.133 に答える
0

してみてください:

public virtual List<Game> Games { get; set; }

virtualコードファーストAPIでは、遅延読み込みを使用する場合と同様に、ナビゲーションプロパティを指定する必要があります。C#EFコードファースト仮想キーワードを参照してください、それは何をしますか?

于 2013-01-22T12:48:41.107 に答える
0
public class Player
{
    public Player()
    {
        this.Games = new List<Game>();
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public List<Game> Games { get; set; }
}

var players = badmintonDB.Players;遅延読み込みがオンで、とのように関係を変更しなかった場合は、関連するすべてのゲームを含むすべてのプレーヤーを返す必要がありますMap();

ただし、遅延読み込みを使用してデータを読み込む場合は、出力内容に実際に依存することに注意してください。たとえば、すべてのデータをJSON文字列で出力する場合は、すべてのゲームが読み込まれます。そうでなければ、表示するゲームは必要ないと思われるので、気になりません。

于 2013-01-22T13:44:22.237 に答える