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

EF Core查询包含关联集合时触发ORA-00904无效标识符错误的原因?

EF Core Include关联数据触发ORA-00904错误的原因与修复

错误根源:实体类配置问题,Include用法无错

你的Include用法是正确的,问题出在实体类的关联配置上,具体原因有两点:

  • 主键与外键类型不匹配:Observation的主键Id是int类型,但ObservationCba的关联字段ObservationId是long类型,EF Core无法正确识别这对关联关系,生成的SQL会出现无效标识符。
  • 未明确配置外键关联:你只定义了导航属性和关联字段,但没有告诉EF Core两者的关联关系,EF Core自动推断失败后,生成的SQL会包含不存在的字段,触发ORA-00904错误。

修复方案

1. 修正字段类型匹配

将ObservationCba的ObservationId类型改为int,与主表主键类型保持一致:

[Table("OBSERVATIONCBA", Schema = Constants.TABLE_SCHEMA_NAME)]
public class ObservationCba : IEntity<long>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("OBSERVATIONCBAID")]
    public override long Id { get; set; }

    [Column("OBSERVATIONID")]
    public int ObservationId { get; set; } // 改为int类型
}

2. 明确配置关联关系

可以通过两种方式配置:

方式一:数据注解

在ObservationCba中添加导航属性并标记外键:

[Table("OBSERVATIONCBA", Schema = Constants.TABLE_SCHEMA_NAME)]
public class ObservationCba : IEntity<long>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("OBSERVATIONCBAID")]
    public override long Id { get; set; }

    [Column("OBSERVATIONID")]
    public int ObservationId { get; set; }

    [ForeignKey(nameof(ObservationId))]
    public virtual Observation? Observation { get; set; }
}

方式二:Fluent API(配置更清晰)

在DbContext的OnModelCreating方法中配置关联:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Observation>()
        .HasMany(observation => observation.ObservationCbas)
        .WithOne() // 若ObservationCba不需要回导航到Observation,保持空即可
        .HasForeignKey(observationCba => observationCba.ObservationId);
}

内容的提问来源于stack exchange,提问作者Homer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:53:29