当前位置: 首页 > 知识库问答 >
问题:

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

陆栋
2023-03-14

我正在使用一个应用程序使用asp.net核心2.2efcore数据库第一种方法与Oracle数据库。我正在使用Oracle。EntityFrameworkCore(2.19.60)nuget包,成功映射db模型,但当我尝试从DBContext获取数据时,得到错误

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

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

代码:

var fetched = await myDatabaseContext.MyTableVersions.ToListAsync();

LinQ正在生成以下查询:

SELECT "m"."Id", "m"."MAJORVERSION" FROM "MyTableVersions" "m"

由于这不是PL/Sql查询的正确语法,因此获得错误ORA-00904:"m"。"id":无效的标识符。

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

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

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

但这个问题与模式有关。

共有3个答案

濮阳默
2023-03-14

若要避免区分大小写的问题,请添加消除EF的选项,以便向生成的查询添加引号。例如,如果您使用Devart Oracle提供商,则可以通过以下方式完成:

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpDbContextOptions>(options =>
        {
            var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance;
            config.Workarounds.DisableQuoting = true;
            ...
        }
    }

如果您使用的是官方提供商-只需从Db命令拦截器继承(在中的db命令中用空字符替换引号...执行方法),将此拦截器添加到DbContextOptionsBuilder实例。

金何平
2023-03-14

在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>

所以:首先确定表和列名到底是什么,然后适当地使用它们。

羊舌和安
2023-03-14

该查询完全有效(db)

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

然而,我怀疑你的桌子看起来像

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

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

 类似资料:
  • Oracle 11g Express Edition..创建表时出错 ORA-00904:无效标识符

  • 我已经在虚拟XP中安装了Oracle 10g,并使用 并且成功地创建了表。但是当我试图通过简单的查询获取值时,如 我得到的错误就像 ORA-00904:"bbb":无效标识符 我不能理解我在这里做错了什么。

  • 创建此表后,我正在尝试添加外键 我想使用Alter table创建的外键是Sailnumber: ALTER表成员添加外键(sailnumber)引用船(sailnumber) sailnumber是table boat的主键,如下所示 然而,我得到了这个错误SQL错误: ORA-00904:"SAILNUMBER":无效的标识符,我不知道为什么我得到有人能告诉我哪里出错了吗?

  • 我正在尝试使用此查询创建一个表(customer)到数据库, 我得到以下回复: 错误报告-SQL错误:ORA-00904::标识符00904无效。00000-%s:无效标识符

  • 有人能帮我找出为什么这段代码返回一个SQLOracle ORA-00904:无效的索引符错误吗?查询在没有Country='阿根廷'的情况下有效,但我需要按此值向下过滤。有人能给我指出正确的方向吗?

  • 我写以下查询作为源在我的ADF。我得到以下错误: 错误[42S22][Microsoft][ODBC Oracle Wire Protocol driver][Oracle]ORA-00904::标识符无效 需要找出错误在哪里吗?