Ошибка EFCore: - ORA-00904: "m". "Id": неверный идентификатор - PullRequest
0 голосов
/ 26 февраля 2020

Я работаю с приложением, использующим asp.net core 2.2 и efcore database первый подход с Oracle database. Я использую пакет Oracle.EntityFrameworkCore (2.19.60) nuget, успешно сопоставлена ​​модель БД, но когда я пытаюсь извлечь данные из DBContext, получаю ошибку

ORA-00904: "m". "Id" : неверный идентификатор

Oracle Версия базы данных: Oracle База данных 12 c Standard Edition Release 12.2.0.1.0 - 64-битная версия

код:

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: НЕВЕРНЫЙ ИДЕНТИФИКАТОР

, но эта проблема связана к схеме.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Запрос совершенно действителен ( db <> здесь fiddle ), при условии, что ваша таблица выглядит примерно так:

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

Однако я подозреваю, что ваша таблица выглядит как

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

Я не знаю, как выглядит класс, в который вы пытаетесь выбрать, но я подозреваю, что у него есть поле с именем Id. Если вы можете изменить имя этого поля на ID (другими словами, чтобы его заглавные буквы совпадали с заглавными буквами соответствующего столбца базы данных), вы можете найти, что оно работает.

0 голосов
/ 26 февраля 2020

Двойные кавычки - это то, чего вам следует избегать в Oracle мире.

Ваш запрос:

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

означает, что имя столбца точно Id ( капитал I, за которым следует d). Только если это действительно так, вы должны использовать двойные кавычки. В противном случае просто удалите их:

SELECT m.id, m.MAJORVERSION FROM MyTableVersions m

То же самое относится и к имени таблицы - если она была создана с использованием смешанного регистра (и вы не можете сделать это без двойных кавычек), вам придется использовать двойной кавычки и точно такой же регистр букв всегда . В противном случае не используйте их.

Oracle не учитывает регистр имен объектов и столбцов и по умолчанию имеет значение UPPERCASE:

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>

Итак: сначала убедитесь, что на самом деле имена таблиц и столбцов, а затем используйте их соответствующим образом.

...