EF Core SQLite复合主键生成异常,PostgreSQL正常,求助排查
问题排查与解决方案
问题根源
SQLite的EF Core Provider在处理record类型的复合主键时,未正确识别[PrimaryKey]特性,默认自动生成了名为Id的主键列,导致StageEntity的实际主键与你定义的复合主键不匹配,进而引发外键引用错误(外键指向的复合列并非目标表的主键)。而Npgsql Provider对特性的识别更准确,因此能正确生成架构。
修复步骤
1. 显式配置StageEntity的复合主键
仅依赖[PrimaryKey]特性不足以让SQLite Provider正确识别record类型的复合主键,需在ModelBuilder中显式声明:
modelBuilder.Entity<StageEntity>(entity => { // 显式指定复合主键,覆盖默认的Id生成逻辑 entity.HasKey(e => new { e.InterviewProcessId, e.Position }); });
2. 完善双向导航属性配置
确保StageEntity包含对应的反向导航属性,让EF Core能正确关联两张表的关系:
[PrimaryKey(nameof(InterviewProcessId), nameof(Position))] public record StageEntity { public InterviewProcessEntity InterviewProcess { get; set; } = null!; public Guid InterviewProcessId { get; set; } public int Position { get; set; } // 添加反向导航属性,与TalentStageEntity的Stage属性对应 public ICollection<TalentStageEntity> TalentStages { get; set; } = new List<TalentStageEntity>(); }
3. 重新生成并应用迁移
由于之前的迁移可能已包含错误的Id列定义,需清理旧迁移并重新生成:
- 删除项目中已生成的SQLite迁移文件
- 执行命令重新生成迁移:
dotnet ef migrations add InitialCreate_SQLite - 更新数据库:
dotnet ef database update
验证
完成上述步骤后,StageEntity对应的表将以InterviewProcessId和Position作为复合主键,不会再生成额外的Id列,外键引用关系也能正常匹配,解决foreign key mismatch错误。
内容的提问来源于stack exchange,提问作者Stefan S.
相关产品推荐
相关产品推荐

