EF Core中RemittanceClass与RemittanceStatus关联配置报错求助
问题修复方案
错误原因分析
- 外键冲突:同时为一对多(HistoryStatus)和一对一(CurrentStatus)关系配置了同一个外键
RemittanceId,EF Core无法区分两个关系,自动生成了额外的外键RemittanceId1。 - 全局查询筛选器冲突:ABP框架的
FullAuditedAggregateRoot和AuditedAggregateRoot默认包含软删除全局查询筛选器,RemittanceStatus的Remittance导航为必填项,当关联的RemittanceClass被软删除后,会出现导航找不到实体的问题。 - 多级联路径:两个外键都指向
RemittanceClass且默认启用级联删除,SQL Server不允许存在多条级联删除路径。
步骤1:修正实体类定义
调整RemittanceStatus的导航属性为可选,适配软删除筛选器的要求:
public class RemittanceStatus : AuditedAggregateRoot<Guid> { // 将必填导航改为可选,解决筛选器冲突 public RemittanceClass? Remittance { get; set; } public Guid RemittanceId { get; set; } public DateTime StatusDate { get; set; } public Status Status { get; set; } }
步骤2:修正EF Core关联配置
分开配置一对多和一对一关系,避免外键混淆并解决级联路径问题:
builder.Entity<RemittanceClass>(builder => { builder.ToTable(RemittanceConsts.DbTablePrefix + "Remittances", RemittanceConsts.DbSchema); builder.ConfigureByConvention(); // 配置一对多关系:RemittanceClass -> HistoryStatus集合 builder.HasMany(remittance => remittance.HistoryStatus) .WithOne(status => status.Remittance) .HasForeignKey(status => status.RemittanceId) .OnDelete(DeleteBehavior.Cascade); // 按需级联删除历史状态 // 配置一对一关系:RemittanceClass -> CurrentStatus builder.HasOne(remittance => remittance.CurrentStatus) .WithOne() // 无需反向导航,避免关系混淆 .HasForeignKey<RemittanceClass>(remittance => remittance.CurrentStatusId) .OnDelete(DeleteBehavior.Restrict); // 禁用级联删除,避免多路径冲突 });
步骤3:重新生成迁移并更新数据库
执行以下命令完成数据库同步:
# 删除已生成的错误迁移(如果存在) Remove-Migration # 生成新的正确迁移 Add-Migration FixRemittanceRelationships # 更新数据库 Update-Database
内容的提问来源于stack exchange,提问作者Maen963
相关产品推荐
相关产品推荐

