运行EntityFramework脚手架生成代码时遇ORA-00904无效标识符错误
解决EF脚手架生成代码引发的ORA-00904无效标识符错误
问题说明
运行Entity Framework脚手架生成的代码时,触发Oracle数据库异常:
Oracle.ManagedDataAccess.Client.OracleException : ORA-00904: "p0"."ModifiedByNavigationUuid": invalid identifier
经排查,问题根源是Entity Framework错误地将导航属性名称与关联对象的ID字段拼接,生成了数据库中不存在的列名ModifiedByNavigationUuid。
修复方案
手动配置实体关系:在
DbContext的OnModelCreating方法中,显式指定导航属性对应的外键,避免EF自动推断出错。示例代码:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<目标实体类>() .HasOne(e => e.ModifiedByNavigation) // 导航属性 .WithMany() .HasForeignKey(e => e.ModifiedByUuid); // 数据库中实际存在的外键字段 }清理冗余生成属性:检查脚手架生成的实体类,若存在自动生成的
ModifiedByNavigationUuid这类冗余字段,直接删除,保留正确的外键字段(如ModifiedByUuid)和导航属性(如ModifiedByNavigation)。自定义命名约定:若项目频繁出现此类问题,可自定义EF的外键命名规则,避免自动拼接导航属性名称。示例:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties() .Where(p => p.Name.EndsWith("Uuid")) .HaveColumnName(p => p.Name); // 强制使用属性原名作为数据库列名 }
验证方式
修复后重新运行代码,查看EF生成的SQL语句,确认不再出现ModifiedByNavigationUuid这类不存在的列名,确保SQL直接引用数据库中实际存在的外键列。
内容的提问来源于stack exchange,提问作者Johnny Wu
相关产品推荐
相关产品推荐

