1

我正在使用 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

如果我这样做,我会在我的 Tournament 表中获得属性 OfficialID 和 HeadOfficial_OfficialID,并在我的 Officials 表中获得 TournamentID、Tournament_TournamentID 和 Tournament_TournamentID1。我意识到我现在不仅在锦标赛和官方之间有一对多的关系(认为锦标赛可以有很多官员),而且我也有一对一的关系(认为锦标赛只能有一个头)官方的)。

我该如何解决这个问题?

4

1 回答 1

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);
于 2012-03-27T19:19:08.290 回答