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
相关产品推荐
相关产品推荐

