1

この問題でデータベースを構築するために、コードファーストアプローチを使用しています。私は次の(部分的な)エンティティを持っています:

public class Tournament {
    public int TournamentID { get; set; }
    public String Name { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public int? SportID { get; set; }

    public virtual Sport Sport { get; set; }

    public virtual ICollection<Official> Officials { get; set; }
}

公式エンティティでは、私はこれを持っています:

public class Official {
    public int OfficialID { get; set; }
    public String Surname { get; set; }
    public String FirstName { get; set; }
    public int? TournamentID { get; set; }

    public virtual Tournament Tournament { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

いくつかのサンプルデータを使用してSQLServerデータベースをチェックすると、これは期待どおりに機能します。トーナメントは役員と1対多の関係にあります。

私が抱えている問題は、トーナメントでオフィシャルの主キーをヘッドオフィシャルとして保持したいということです。だから私はトーナメントエンティティに追加します:

public int? OfficialID { get; set; } // foreign key to official table
public virtual Official HeadOfficial { get; set; } // navigation property

これを行うと、トーナメントテーブルに属性OfficialIDとHeadOfficial_OfficialIDが取得され、オフィシャルテーブルにTournamentID、Tournament_TournamentID、Tournament_TournamentID1が取得されます。私は今、トーナメントとオフィシャルの間に1対多の関係があるだけでなく(トーナメントは多くのオフィシャルを持つことができる)、1対1の関係も持っている(トーナメントは1つの頭しか持てないので)正式)。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

EFに、どのナビゲーションプロパティが一緒に属するかについてのヒントを与えることで、問題を修正できます。同じターゲットクラスを参照するクラスに2つのナビゲーションプロパティがある場合、EF規則はこれを決定できなくなります。

public class Tournament {
    public int TournamentID { get; set; }
    //...

    public int? OfficialID { get; set; }
    [ForeignKey("OfficialID")]
    public virtual Official HeadOfficial { get; set; }

    [InverseProperty("Tournament")] // the navigation property in Official class
    public virtual ICollection<Official> Officials { get; set; }
}

必要に応じて、FluentAPIを使用することもできます。

modelBuilder.Entity<Tournament>()
    .HasOptional(t => t.HeadOfficial)
    .WithMany()
    .HasForeignKey(t => t.OfficialID);

modelBuilder.Entity<Tournament>()
    .HasMany(t => t.Officials)
    .WithOptional(o => o.Tournament)
    .HasForeignKey(o => o.TournamentID);
于 2012-03-27T19:19:08.290 に答える