2012-03-27 155 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