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;
...
}
}