Entity Framework中如何将主键作为另一表两个字段的外键
Entity Framework多外键关联同表解决方案
首先可以明确:一张表的主键完全可以在另一张表中作为多个不同外键使用,你当前代码无法运行的核心原因是同一个类下存在重名的外键字段和导航属性,C#语法不允许同级别出现同名属性,同时EF也无法自动匹配重名属性的映射关系。
正确实现代码
你只需要给两个关联Recruiter的字段和导航属性按业务含义命名,同时显式指定外键关联关系即可:
public class ResumeSharing { [Key] public int ResumeSharingId { get; set; } [ForeignKey("AppliedJobs")] public int AppliedJobId { get; set; } public virtual AppliedJob AppliedJobs { get; set; } public bool OwnCompany { get; set; } [Display(Name = "RecruiterFrom")] public int RecruiterFromId { get; set; } [ForeignKey("RecruiterFromId")] public virtual Recruiter RecruiterFrom { get; set; } [Display(Name = "RecruiterTo")] public int RecruiterToId { get; set; } [ForeignKey("RecruiterToId")] public virtual Recruiter RecruiterTo { get; set; } [ForeignKey("Companies")] public int CompanyId { get; set; } public virtual Company Companies { get; set; } public string SharedFiles { get; set; } }
可选Fluent API配置(推荐)
如果不想在实体类中加过多注解,也可以在DbContext的OnModelCreating方法中统一配置关联关系,同时可以规避多外键关联的级联删除冲突:
modelBuilder.Entity<ResumeSharing>() .HasOne<Recruiter>(s => s.RecruiterFrom) .WithMany() .HasForeignKey(s => s.RecruiterFromId) .OnDelete(DeleteBehavior.Restrict); // 按需配置删除行为,避免多路径级联删除报错 modelBuilder.Entity<ResumeSharing>() .HasOne<Recruiter>(s => s.RecruiterTo) .WithMany() .HasForeignKey(s => s.RecruiterToId) .OnDelete(DeleteBehavior.Restrict);
注意事项
两个外键同时关联同一张表时,EF默认开启的级联删除会触发多路径删除冲突,建议根据业务需求显式设置为Restrict或者NoAction删除行为。如果需要在Recruiter实体中添加反向导航属性,只需要在Recruiter类中添加对应的集合属性,同时在WithMany参数中指定反向属性名即可。
内容的提问来源于stack exchange,提问作者deepak krishna
相关产品推荐
相关产品推荐

