2012-03-27 19 views
1

私はこの問題でデータベースを構築するためにコードファーストアプローチを使用しています。 、いくつかのサンプルデータを使用してSQL Serverデータベースをチェックエンティティ間のEF複数の関係

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; } 
} 

私はそれが期待されるので、これは動作します:公式のエンティティで

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; } 
} 

私はこれを持っている:私は、次の(部分)エンティティを持っています。トーナメントは関係者と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の関係も持っています公式)。

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

答えて

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; } 
} 

あなたがすることを好む場合、それは流暢APIともできます:

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); 
+0

は、多くの先生を義務づけしかし、私はFluent APIの第2部分を理解していません。エンティティトーナメントには多くの役人(私はそれを理解しています)が、その後トーナメントWithOptionalトーナメントとHasForeignKeyトーナメントIDを持っていますか?なぜトーナメントはトーナメントIDを持っていますか? – Mekswoll

+0

@pEkvo:最後の 'HasForeignKey'は、' Tournament'ではなく 'Official'エンティティのプロパティ式を取るので、' TournamentID'は 'Official'のFKです。ラムダパラメータでは、基本的に 't' =" Tournament "、" o' = "Official"です。 – Slauma

+0

うん、それは今、非常にありがとう、それを理解しています。 – Mekswoll

関連する問題