EF实体之间的多种关系

时间:2012-03-27 19:10:19

标签: asp.net-mvc-3 entity-framework table-relationships

我正在使用Code First方法在此问题中构建数据库。我有以下(部分)实体:

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,我在Officials表中获得了TournamentID,Tournament_TournamentID和Tournament_TournamentID1。我意识到我现在不仅在锦标赛和官方之间有一对多的关系(看到锦标赛可以有很多官员),但我也有一对一的关系(看到锦标赛只能有一个头官)。

如何解决此问题?

1 个答案:

答案 0 :(得分: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; }
}

如果您愿意,也可以使用Fluent 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);