Entity Framework中含双外键的表生成迁移时出错求助
解决EF Core多外键关联同一表的关系配置异常问题
执行dotnet ef migrations add RequestLedger生成迁移时出现错误:无法确定RequestLedger.NewStatus导航属性对应的RequestStatusType类型关系,需手动配置或忽略该属性。相关代码如下:
相关代码
RequestLedger.cs
public long OldStatusId { get; set; } public long NewStatusId { get; set; } public virtual RequestStatusType OldStatus { get; set; } = null!; public virtual RequestStatusType NewStatus { get; set; } = null!;
RequestLedgerEntityTypeConfiguration.cs
builder.HasOne(d => d.OldStatus) .WithMany(p => p.OldRequestLedgers) .HasForeignKey(d => d.OldStatusId) .OnDelete(DeleteBehavior.Restrict); builder.HasOne(d => d.NewStatus) .WithMany(p => p.NewRequestLedgers) .HasForeignKey(d => d.NewStatusId) .OnDelete(DeleteBehavior.Restrict);
RequestStatusType.cs
OldRequestLedgers = new HashSet<RequestLedger>(); NewRequestLedgers = new HashSet<RequestLedger>(); public virtual ICollection<RequestLedger> OldRequestLedgers { get; set; } public virtual ICollection<RequestLedger> NewRequestLedgers { get; set; }
问题排查与解决
你的配置逻辑本身是正确的,异常大概率是EF Core未正确识别配置类导致,按以下步骤检查:
确认配置类已注册到DbContext:
确保RequestLedgerEntityTypeConfiguration实现了IEntityTypeConfiguration<RequestLedger>接口,并在DbContext的OnModelCreating方法中完成注册:protected override void OnModelCreating(ModelBuilder modelBuilder) { // 单个注册配置类 modelBuilder.ApplyConfiguration(new RequestLedgerEntityTypeConfiguration()); // 或批量加载当前程序集内所有配置类 modelBuilder.ApplyConfigurationsFromAssembly(typeof(RequestLedgerEntityTypeConfiguration).Assembly); }清理旧迁移后重新生成:
删除项目中Migrations文件夹下的旧迁移文件(保留DesignTimeDbContextFactory相关文件),再重新执行迁移命令:dotnet ef migrations add RequestLedger确认集合属性初始化位置:
确保RequestStatusType的集合属性是在构造函数中完成初始化的,避免语法错误:public class RequestStatusType { public RequestStatusType() { OldRequestLedgers = new HashSet<RequestLedger>(); NewRequestLedgers = new HashSet<RequestLedger>(); } public virtual ICollection<RequestLedger> OldRequestLedgers { get; set; } public virtual ICollection<RequestLedger> NewRequestLedgers { get; set; } // 其他实体属性 }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

