Не удалось очистить внешний ключ. Таблица (ключи ...). Ключ для «имен полей» не найден в основном объекте типа XXX. - PullRequest
0 голосов
/ 11 июня 2019

Я столкнулся с проблемой при создании контекста моей базы данных при использовании команды scaffold-dbcontext.Кажется, проблема возникает, когда генерируются ограничения внешнего ключа.

Я не знаю, прав ли я, но подозреваю, что проблема связана с тем фактом, что в родительской таблице более одного дочернего элемента.Команда scaffold анализирует результаты, возвращенные после запроса системных таблиц.Мне интересно, правильно ли интерпретируются результаты, когда несколько дочерних элементов (с одинаковыми внешними ключами) появляются под одной родительской таблицей.

Таблицы:

У TRANSPORT есть дочерний PRODORDER

PRODORDER имеет дочерний PRODORDERPAR PRODORDER имеет дочерний BUNDLE

BUNDLE имеет дочерний BUNDLEPAR

Я приложил файл со сценарием для создания примера.Если в консоли диспетчера пакетов Visual Studio введена следующая команда: Scaffold-DbContext "Источник данных = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = xx.xx.xx.xx) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = YOUSERVICE))) Пользователь Id = USERNAME; Password = USERPWD»Oracle.EntityFrameworkCore -Force -OutputDir Модели / Entity -Tables ТРАНСПОРТ, PRODORDER, ПАКЕТ, BUNDLEPAR -ContextDir Модели / Context -Context BundleContext

1014 *, то это заканчивается следующей проблемой: Не удалось создать внешний ключ 'ONETRLAARC.BUNDLE (FKTRANSPORTID, FKTRANSPORTID, FKPOID, FKPOID)'.Ключ для 'POID; FKTRANSPORTID; POID; FKTRANSPORTID' не найден в основном типе сущности 'Prodorder'.

Моя версия сборок: Oracle.EntityFrameworkCore 2.19.0-beta4 Oracle.ManagedDataAccess.Core2.19.3

Не могли бы вы сказать мне, если я сделал что-то не так?

Я проверил на двух серверах, и результат точно такой же.

-- TRANSPORT

CREATE TABLE TRANSPORT
(
  TRANSPORTID   VARCHAR2(20 CHAR)               NOT NULL,
  SITEORIGINID  VARCHAR2(3 CHAR)                NOT NULL,
  EXITDATE      DATE,
  MOTID         VARCHAR2(20 CHAR),
  INCOTERM      VARCHAR2(3 CHAR),
  DESTINATION   VARCHAR2(20 CHAR),
  NETWEIGHT     NUMBER(13),
  GROSSWEIGHT   NUMBER(13),
  CREATOR       VARCHAR2(32 CHAR),
  CREATEDATE    DATE,
  MODIFIER      VARCHAR2(32 CHAR),
  MODIFDATE     DATE
);

CREATE INDEX IDX_TRANSPORT_01 ON TRANSPORT(SITEORIGINID);
CREATE UNIQUE INDEX IDX_TRANSPORT_PK ON TRANSPORT(TRANSPORTID);

ALTER TABLE TRANSPORT ADD (
  CONSTRAINT IDX_TRANSPORT_PK
  PRIMARY KEY
  (TRANSPORTID)
  USING INDEX IDX_TRANSPORT_PK
  ENABLE VALIDATE);


-- PRODORDER
CREATE TABLE PRODORDER
(
  POID           VARCHAR2(20 CHAR)              NOT NULL,
  FKTRANSPORTID  VARCHAR2(20 CHAR)              NOT NULL,
  CREATOR        VARCHAR2(32 CHAR),
  CREATEDATE     DATE,
  MODIFIER       VARCHAR2(32 CHAR),
  MODIFDATE      DATE
);

CREATE UNIQUE INDEX IDX_PRODORDER_PK ON PRODORDER(POID, FKTRANSPORTID);

ALTER TABLE PRODORDER ADD (
  CONSTRAINT IDX_PRODORDER_PK
  PRIMARY KEY
  (POID, FKTRANSPORTID)
  USING INDEX IDX_PRODORDER_PK
  ENABLE VALIDATE);

ALTER TABLE PRODORDER ADD (
  CONSTRAINT IDX_PRODORDER_FK 
  FOREIGN KEY (FKTRANSPORTID) 
  REFERENCES TRANSPORT (TRANSPORTID)
  ON DELETE CASCADE
  ENABLE VALIDATE);

-- PRODORDERPAR
CREATE TABLE PRODORDERPAR
(
  NAME           VARCHAR2(40 CHAR)              NOT NULL,
  VALUE          VARCHAR2(512 CHAR),
  FKTRANSPORTID  VARCHAR2(20 CHAR)              NOT NULL,
  FKPOID         VARCHAR2(20 CHAR)              NOT NULL,
  CREATOR        VARCHAR2(32 CHAR),
  CREATEDATE     DATE,
  MODIFIER       VARCHAR2(32 CHAR),
  MODIFDATE      DATE
);

CREATE UNIQUE INDEX IDX_PRODORDERPAR_PK ON PRODORDERPAR(NAME, FKPOID, FKTRANSPORTID);

ALTER TABLE PRODORDERPAR ADD (
  CONSTRAINT IDX_PRODORDERPAR_PK
  PRIMARY KEY
  (NAME, FKPOID, FKTRANSPORTID)
  USING INDEX IDX_PRODORDERPAR_PK
  ENABLE VALIDATE);

ALTER TABLE PRODORDERPAR ADD (
  CONSTRAINT IDX_PRODORDERPAR_FK 
  FOREIGN KEY (FKPOID, FKTRANSPORTID) 
  REFERENCES PRODORDER (POID,FKTRANSPORTID)
  ON DELETE CASCADE
  ENABLE VALIDATE);


-- BUNDLE
CREATE TABLE BUNDLE
(
  GLOBALID          VARCHAR2(20 CHAR)           NOT NULL,
  INTERNALID        VARCHAR2(20 CHAR),
  LOCALID           VARCHAR2(20 CHAR),
  ARTICLEID         VARCHAR2(20 CHAR),
  NETWEIGHT         NUMBER(13),
  GROSSWEIGHT       NUMBER(13),
  CONSUMED          INTEGER                     DEFAULT 0,
  CONSUMEDDATE      DATE,
  CONSUMPTIONID     VARCHAR2(20 CHAR),
  ENTRYDATE         DATE,
  BLOCKED           INTEGER                     DEFAULT 0,
  INVOICEDATE       DATE,
  REMARKS           NVARCHAR2(2000),
  FKTRANSPORTID     VARCHAR2(20 CHAR)           NOT NULL,
  FKPOID            VARCHAR2(20 CHAR)           NOT NULL,
  CREATOR           VARCHAR2(32 CHAR),
  CREATEDATE        DATE,
  MODIFIER          VARCHAR2(32 CHAR),
  MODIFDATE         DATE,
  RECEIPTDATE       DATE,
  REPELLED          INTEGER                     DEFAULT 0,
  REPELLEDDATE      DATE,
  BLOCKEDDATE       DATE,
  DESADVID          VARCHAR2(20 CHAR),
  DESADVSTATUS      VARCHAR2(10 CHAR),
  DESADVSTATUSDATE  DATE
);

CREATE UNIQUE INDEX IDX_BUNDLE_01 ON BUNDLE(GLOBALID, FKPOID, FKTRANSPORTID);
CREATE INDEX IDX_BUNDLE_02 ON BUNDLE(INTERNALID);
CREATE INDEX IDX_BUNDLE_03 ON BUNDLE(LOCALID);
CREATE INDEX IDX_BUNDLE_04 ON BUNDLE(CONSUMED, CONSUMEDDATE);
CREATE INDEX IDX_BUNDLE_05 ON BUNDLE(DESADVID);

CREATE UNIQUE INDEX IDX_BUNDLE_PK ON BUNDLE(GLOBALID);
ALTER TABLE BUNDLE ADD (
  CONSTRAINT IDX_BUNDLE_PK
  PRIMARY KEY
  (GLOBALID)
  USING INDEX IDX_BUNDLE_PK
  ENABLE VALIDATE);

ALTER TABLE BUNDLE ADD (
  CONSTRAINT IDX_BUNDLE_FK 
  FOREIGN KEY (FKPOID, FKTRANSPORTID) 
  REFERENCES PRODORDER (POID,FKTRANSPORTID)
  ON DELETE CASCADE
  ENABLE VALIDATE);

-- BUNDLEPAR
CREATE TABLE BUNDLEPAR
(
  NAME           VARCHAR2(40 CHAR)              NOT NULL,
  VALUE          VARCHAR2(512 CHAR),
  FKTRANSPORTID  VARCHAR2(20 CHAR)              NOT NULL,
  FKPOID         VARCHAR2(20 CHAR)              NOT NULL,
  FKBGLOBALID    VARCHAR2(20 CHAR)              NOT NULL,
  CREATOR        VARCHAR2(32 CHAR),
  CREATEDATE     DATE,
  MODIFIER       VARCHAR2(32 CHAR),
  MODIFDATE      DATE
);

CREATE UNIQUE INDEX IDX_BUNDLEPAR_PK ON BUNDLEPAR(NAME, FKBGLOBALID);

ALTER TABLE BUNDLEPAR ADD (
  CONSTRAINT IDX_BUNDLEPAR_PK
  PRIMARY KEY
  (NAME, FKBGLOBALID)
  USING INDEX IDX_BUNDLEPAR_PK
  ENABLE VALIDATE);

ALTER TABLE BUNDLEPAR ADD (
  CONSTRAINT IDX_BUNDLEPAR_FK 
  FOREIGN KEY (FKBGLOBALID) 
  REFERENCES BUNDLE (GLOBALID)
  ON DELETE CASCADE
  ENABLE VALIDATE);
...