1

エンティティ フレームワークを使い始めたばかりで、リポジトリとコンテキスト クラスとインターフェイスを作成し、POCO を定義しました。現在、規則がどのように機能するかを理解しようとしていますが、問題があり、これまでのところ理解できていません。

次の2つのPOCOクラスがあります。

ゲームウィーク

public class Gameweek
{
    [Key][Required]
    public int GameweekID { get; set; }

    [Required]
    public DateTime StartDate { get; set; }

    [Required]
    public DateTime Deadline { get; set; }

    [Required]
    public int NumberFixtures { get; set; }

    public virtual ICollection<Fixture> Fixtures { get; set; }

    public virtual ICollection<Result> Results { get; set; }
}

備品

public class Fixture
{
    [Key][Required]
    public int FixtureID { get; set; }

    [Required]
    public int GameweekID { get; set; }

    [Required]
    public string HomeTeam { get; set; }

    [Required]
    public string AwayTeam { get; set; }

    public virtual Result Result { get; set; }
}

結果

public class Result
{
    [Key][Required]
    public int FixtureID { get; set; }

    [Required]
    public int HomeGoals { get; set; }

    [Required]
    public int AwayGoals { get; set; }
}

私のモデルでは、ゲームウィークには 0 ~ 20のフィクスチャを含めることができます。ゲームウィークの各フィクスチャには 1 つの結果があります。

クラスと次の規則でこれを正しくモデル化していますか?

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove < PluralizingTableNameConvention>();

        //Table relationships defined here
        modelBuilder.Entity<Gameweek>()
            .HasMany(g => g.Fixtures);                  

        modelBuilder.Entity<Fixture>()
            .HasOptional(f => f.Result);                    

    }

どんなヒントでも大歓迎です。

4

1 に答える 1

1

Fixtureどうやら と の間に1 対 1 の関係を持ちたいようですResult(Resultエンティティは複数の 間で共有できませんFixture)。この場合、マッピングは 100% 正しくありません。必要なもの:

modelBuilder.Entity<Fixture>()
    .HasOptional(f => f.Result)
    .WithRequired();

WithRequiredEF 規則を追加しない場合WithMany、1 対 1 の関係ではなく 1 対多の関係が想定されます。

慣例といえば、実際にはmodelBuilder.Entity<Gameweek>().HasMany(g => g.Fixtures);すべて [Required]の属性、および の[Key]属性を削除できますGameweek。上記の 1 対 1 のマッピングと[Key]on 属性のみResult.FixtureIDが必要です。他のすべては、規則に基づいて自動的にマップされます。

于 2013-06-18T22:21:14.463 に答える