EFCore error:- ORA-00904: "m"."Id": invalid identifier
EFCore error:- ORA-00904: "m"."Id": invalid identifier
我正在使用 asp.net core 2.2
和 efcore 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
实例。
我正在使用 asp.net core 2.2
和 efcore 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
实例。