使用EF Core查询Oracle 11g时遇ORA-00933错误的求助
解决Oracle 11g+EF Core 7关键字列名查询报错问题
问题原因
INT是Oracle的保留关键字,直接引用会触发语法错误;手动添加双引号时,EF Core的Oracle驱动会对引号进行二次转义,生成""INT""这样的无效标识符,导致ORA-01741错误。
解决方案
1. 匹配驱动版本
确保使用的Oracle.EntityFrameworkCore版本与EF Core 7.x完全匹配(例如安装Oracle.EntityFrameworkCore 7.21.x版本),版本不兼容会引发各类解析问题。
2. 启用带引号标识符全局配置
在DbContext的配置中开启Oracle的带引号标识符支持,让EF Core自动为关键字列添加正确的双引号:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseOracle("你的数据库连接字符串", oracleOptions => oracleOptions.UseQuotedIdentifiers()); }
3. 正确配置实体列映射
无需手动添加双引号,直接在ModelBuilder中指定列名即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<你的实体类>() .Property(e => e.Id) .HasColumnName("INT") .HasColumnType("NUMBER"); // 可显式指定列类型,避免映射错误 }
4. 备选方案:连接字符串参数
也可在连接字符串中直接加入QuoteIdentifier=true参数,替代上述的UseQuotedIdentifiers()配置:
Data Source=你的数据源;User Id=用户名;Password=密码;QuoteIdentifier=true;
5. 验证生成的SQL
若问题仍存在,可开启EF Core日志查看生成的SQL语句,确认列名是否被正确转义:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.LogTo(Console.WriteLine, LogLevel.Information); // 其他配置... }
正常生成的SQL中,列名应显示为"INT"而非INT或""INT""。
内容的提问来源于stack exchange,提问作者Oskar Fjeld
相关产品推荐
相关产品推荐

