2012-03-27 109 views
1

我正在使用Code First方法在此問題中構建數據庫。我有以下的(部分)實體:EF實體之間的多重關係

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

使用一些樣本數據和檢查SQL Server數據庫,這個工程,我就指望它。錦標賽與官員有一對多的關係。

我遇到的問題是,我希望比賽持有主管官員的主鍵。所以,我想補充到比賽實體:

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在我的官員表。我意識到現在我不僅在錦標賽和官方之間有一對多的關係(因爲錦標賽可以有很多官員),但我也有一對一的關係(因爲錦標賽只能有一個頭官方)。

我該如何解決這個問題?

回答

3

您可以通過給EF提示哪些導航屬性屬於一起來解決問題。當你在一個類中的兩個導航特性,這指的是同一個目標類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的第二部分。實體錦標賽有很多官員(我明白這一點),但隨後錦標賽帶有可選錦標賽和HasForeignKey錦標賽ID?爲什麼錦標賽會有一個外鍵的錦標賽ID? – Mekswoll 2012-03-27 19:28:55

+0

@pEkvo:最後一個'HasForeignKey'爲'Official'實體的屬性表達式,而不是'Tournament',所以'TournamentID'是'Official'中的FK。在lambda參數中基本上't' =「比賽」,「o」=「官方」。 – Slauma 2012-03-27 19:32:36

+0

是的,現在明白了,非常感謝。 – Mekswoll 2012-03-27 19:36:53

相關問題