EF Core 导航父类双属性异常:迁移仅生成一个关联列
问题原因分析
EF Core在处理自引用导航属性时,如果没有明确配置关系,会默认将这类导航属性视为同一关系的双向关联;但你这里是两个独立的自引用关联(True/False分支),属于两个不同的外键关系,EF无法自动识别这种场景,加上你错误地在导航属性上使用了[Column]属性(该属性仅适用于标量属性,用来映射数据库列名),导致EF只生成了其中一个外键列。
解决办法
方法1:使用[ForeignKey]属性明确配置(推荐)
先声明对应的标量外键字段,再通过[ForeignKey]将导航属性与标量字段关联:
public class AccountOpenerWorkflowStep { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public DateTime CreatedDate { get; set; } public DateTime ModifiedDate { get; set; } public string Controller { get; set; } public string Action { get; set; } public bool DefaultStep { get; set; } // 声明标量外键字段(可空,因为步骤可能没有后续分支) public int? TrueWorkflowStepId { get; set; } // 关联导航属性与外键字段 [ForeignKey(nameof(TrueWorkflowStepId))] public virtual AccountOpenerWorkflowStep TrueWorkflowStep { get; set; } public int? FalseWorkflowStepId { get; set; } [ForeignKey(nameof(FalseWorkflowStepId))] public virtual AccountOpenerWorkflowStep FalseWorkflowStep { get; set; } }
方法2:使用Fluent API配置(更灵活)
在你的DbContext的OnModelCreating方法中,手动配置两个独立的自引用关系:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置TrueWorkflowStep的自引用关系 modelBuilder.Entity<AccountOpenerWorkflowStep>() .HasOne(a => a.TrueWorkflowStep) .WithMany() // 无对应的集合导航属性,所以用空的WithMany() .HasForeignKey("TrueWorkflowStepId") .OnDelete(ReferentialAction.SetNull); // 配置FalseWorkflowStep的自引用关系 modelBuilder.Entity<AccountOpenerWorkflowStep>() .HasOne(a => a.FalseWorkflowStep) .WithMany() .HasForeignKey("FalseWorkflowStepId") .OnDelete(ReferentialAction.SetNull); }
执行这两种配置后,重新生成迁移,就能看到EF Core同时创建TrueWorkflowStepId和FalseWorkflowStepId两个外键列,以及对应的外键约束了。
内容的提问来源于stack exchange,提问作者A. Hasemeyer
相关产品推荐
相关产品推荐

