我正在使用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。我意识到我现在不仅在锦标赛和官方之间有一对多的关系(看到锦标赛可以有很多官员),但我也有一对一的关系(看到锦标赛只能有一个头官)。
如何解决此问题?
答案 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);