You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:15