EF Core 生成数据库迁移时出现未定义重复外键如何解决?
问题原因
- 关系配置不匹配:
User类中定义了List<SignatureToUser> Signatures的集合导航属性,说明User和SignatureToUser是一对多关系,但你Fluent API中错误配置为.HasOne(l => l.User).WithOne()的一对一关系,EF无法找到和User集合导航匹配的反向关系,就会自动生成默认名为UserId的外键来关联这个未匹配的集合导航。 - Fluent API配置没有显式绑定你自定义的外键字段
SignatureUserID,特性配置和Fluent API优先级冲突也可能导致自定义配置失效。
解决方案
步骤1:修正Fluent API配置
// 配置User和SignatureToUser的一对多关系,显式绑定自定义外键和反向导航 modelBuilder.Entity<SignatureToUser>() .HasOne(l => l.User) .WithMany(u => u.Signatures) // 对应User类里的Signatures集合导航属性 .HasForeignKey(l => l.SignatureUserID) // 绑定你自定义的外键字段 .OnDelete(DeleteBehavior.ClientNoAction); // 配置Signature和SignatureToUser的关系,同样修正为一对多 // 如果Signature类中也有对应的List<SignatureToUser>类型导航属性,就把导航属性名填入WithMany参数中 modelBuilder.Entity<SignatureToUser>() .HasOne(l => l.Signature) .WithMany() .HasForeignKey(l => l.SignatureID) // 显式绑定自定义外键 .OnDelete(DeleteBehavior.ClientNoAction); // 原有索引配置保留即可 modelBuilder.Entity<SignatureToUser>().HasIndex(l => l.SignatureUserID).IsUnique(false); modelBuilder.Entity<SignatureToUser>().HasIndex(l => l.SignatureID).IsUnique(false);
步骤2:重新生成迁移
- 删除之前生成的错误迁移文件,清空数据库中已生成的错误
SignatureToUser表 - 重新执行
Add-Migration和Update-Database命令,不会再生成多余的UserId外键
补充说明
你之前重写User类Id属性的操作完全无效且不必要,可以直接删除,IdentityUser的Id本身已经被标记为主键,不需要重复配置。
内容的提问来源于stack exchange,提问作者JonasK
相关产品推荐
相关产品推荐

