Oracle EFCore错误:-ORA-00904:;m"&引用;Id";:无效的标识符

Oracle EFCore错误:-ORA-00904:;m"&引用;Id";:无效的标识符,oracle,asp.net-core-2.2,ef-core-2.2,Oracle,Asp.net Core 2.2,Ef Core 2.2,我正在使用asp.net core 2.2和efcore数据库第一种方法使用Oracle数据库。我正在使用Oracle.EntityFrameworkCore(2.19.60)nuget包,成功地映射了数据库模型,但当我尝试从DBContext获取数据时,出现了错误 ORA-00904:“m”。“Id”:无效标识符 Oracle数据库版本:Oracle数据库12c标准版12.2.0.1.0-64位生产 代码: LinQ正在生成以下查询: SELECT "m"."Id", "m"."MAJORVE

我正在使用
asp.net core 2.2
efcore数据库
第一种方法使用
Oracle数据库
。我正在使用Oracle.EntityFrameworkCore(2.19.60)
nuget
包,成功地映射了数据库模型,但当我尝试从
DBContext
获取数据时,出现了错误

ORA-00904:“m”。“Id”:无效标识符

Oracle数据库版本:Oracle数据库12c标准版12.2.0.1.0-64位生产

代码:

LinQ正在生成以下查询:

SELECT "m"."Id", "m"."MAJORVERSION" FROM "MyTableVersions" "m"
因为它不是PL/Sql查询的正确语法,所以获取错误ORA-00904:“m”。“Id”:无效标识符

有没有办法修复这个错误?谢谢

我在网上搜索了一下,发现

错误30352492-EFCORE:ORA-00904:无效标识符


但这个问题与模式有关。

在Oracle世界中,双引号是应该避免的

您的查询:

SELECT "m"."Id", "m"."MAJORVERSION" FROM "MyTableVersions" "m"
表示列名正好是
Id
(大写
I
,后跟
d
)。只有这样,你才应该使用双引号。否则,只需删除它们:

SELECT m.id, m.MAJORVERSION FROM MyTableVersions m
表名也是如此——如果它是使用混合大小写创建的(如果没有双引号,就无法做到这一点),则必须使用双引号和完全相同的字母大小写。否则,不要使用它们

Oracle对对象和列名不区分大小写,默认情况下为大写:

SQL> create table test (id number);

Table created.

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- -----------------
 ID                                                 NUMBER

SQL> select table_name, column_name
  2  from user_tab_columns
  3  where table_name = 'TEST';

TABLE_NAME                     COLUMN_NAME
------------------------------ ------------------------------
TEST                           ID

SQL> insert into test (id) values (1);

1 row created.

SQL>
但是,如果使用带双引号的混合大小写,则始终使用它们:

SQL> create table "teST" ("Id" number);

Table created.

SQL> insert into test (id) values (1);
insert into test (id) values (1)
            *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> insert into "test" (id) values (1);
insert into "test" (id) values (1)
            *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> insert into "teST" (id) values (1);
insert into "teST" (id) values (1)
                    *
ERROR at line 1:
ORA-00904: "ID": invalid identifier


SQL> insert into "teST" ("Id") values (1);

1 row created.

SQL>


因此:首先确定表名和列名是什么,然后适当地使用它们。

假设您的表看起来像

CREATE TABLE "MyTableVersions"
  ("Id"          NUMBER,
   MAJORVERSION  NUMBER)
然而,我怀疑你的桌子看起来像

CREATE TABLE "MyTableVersions"
  (ID            NUMBER,
   MAJORVERSION  NUMBER)

我不知道您试图获取的类是什么样子的,但我怀疑它有一个名为
Id
的字段。如果您可以将该字段的名称更改为
ID
(换句话说,使其大小写与相关数据库列的大小写匹配),那么您可能会发现它可以正常工作。

为了避免区分大小写的问题,请添加选项以消除EF,以便在生成的查询中添加引号。例如,如果您使用的是Devart Oracle provider,则可通过以下方式完成:

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpDbContextOptions>(options =>
        {
            var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance;
            config.Workarounds.DisableQuoting = true;
            ...
        }
    }
公共覆盖无效配置服务(ServiceConfigurationContext)
{
配置(选项=>
{
var config=Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance;
config.Workarounds.DisableQuoting=true;
...
}
}

如果您使用的是官方提供程序-只需从
DbCommandInterceptor
继承即可(执行
方法时,请在dbCommand中使用空字符替换引号),将此拦截器添加到
DbContextOptionsBuilder
实例。

相关查询由LinQ生成。我不知道OP是否有方法控制名称引用。感谢Bob Jarvis-Restore Monica。我的表脚本的列名为ID(大写).Net正在创建一个属性名为Id的类。“entity.property(e=>e.Id).ValueGeneratedNever();”,因此,我映射了类似“entity.property(e=>e.Id).HasColumnName(“Id”).ValueGeneratedNever();”的类,尽管手动重命名每个表的Id是很困难的,但解决了我的问题。
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpDbContextOptions>(options =>
        {
            var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance;
            config.Workarounds.DisableQuoting = true;
            ...
        }
    }