EFCore error:- ORA-00904: "m"."Id": invalid identifier

EFCore error:- ORA-00904: "m"."Id": invalid identifier

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

ORA-00904: "m"."Id": invalid identifier

Oracle 数据库版本:Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

代码:

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

LinQ 正在生成以下查询:

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

由于 PL/Sql 查询的语法不正确,因此出现错误 ORA-00904:"m"。"Id":标识符无效。

有什么办法可以解决这个错误吗?谢谢。

我在网上搜索过

Bug 30352492 - EFCORE: ORA-00904: INVALID IDENTIFIER

但该问题与架构有关。

双引号是您在 Oracle 世界中应该避免的东西。

您的查询:

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

表示列名称 恰好 Id(大写 I 后跟 d)。只有当确实如此时,您才应该使用双引号。否则,只需删除它们:

SELECT m.id, m.MAJORVERSION FROM MyTableVersions m

table 名称也是如此 - 如果它是使用大小写混合创建的(没有双引号就不能这样做),则必须使用双引号和完全相同的字母大小写总是。否则,请不要使用它们。

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>

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

查询完全有效 (db<>fiddle here),假设您的 table 类似于

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

不过,我怀疑你的table看起来像

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

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

为避免 case-sensitivity 出现问题,添加选项以消除 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;
            ...
        }
    }

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