Я сгенерировал таблицу в базе данных Oracle с переносом кода Entity Framework сначала (без явных изменений, все по умолчанию).
Модель
public long ID { get; set; }
public long SYSTEMID { get; set; }
public long QTY { get; set; }
public string PART_NO { get; set; }
Возникает проблема при вставке. При попытке добавить через EF журнал выводит:
declare
"ID" number(19,0);
begin
insert into "CONFIG"."PACKAGE_MATERIALS"("SYSTEMID", "QTY", "PART_NO")
values (:p0, :p1, :p2)
returning
"ID" into
"ID";
open :p3 for select
"ID" as "ID" from dual;
end;
-- :p0: '3' (Type = Int64)
-- :p1: '2' (Type = Int64)
-- :p2: '' (Type = Object)
-- :p3: 'null' (Type = Object, Direction = Output, IsNullable = false)
-- Executing at ********************
-- Failed in 20 ms with error:
ORA-04045: errors during recompilation/revalidation of CONFIG.BIN$Xo9DAFoJTAW3XJg5mX0Pug==$0
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
ORA-06512: at line 4
Тот же оператор, запущенный непосредственно с БД, тоже не завершился успешно, хотя я получаю только первую ошибку.
Предположительно, база данных не работает. Не получается сгенерировать идентификатор и вставить его в поле. Последовательность и триггер были сгенерированы автоматически.
Сгенерированный триггер
TRIGGER "CONFIG"."BIN$Xo9DAFoJTAW3XJg5mX0Pug==$0"
before insert on "CONFIG"."PACKAGE_MATERIALS"
for each row
begin
select "CONFIG"."SQ_PACKAGE_MATERIALS".nextval into :new."ID" from dual;
end;
Проблема как бы решается отключением сгенерированного триггера и ручным применением триггера, созданного SQL разработчиком.
TRIGGER PACKAGE_MATERIALS_TRG
BEFORE INSERT ON PACKAGE_MATERIALS
FOR EACH ROW
BEGIN
<<COLUMN_SEQUENCES>>
BEGIN
IF INSERTING AND :NEW.ID IS NULL THEN
SELECT SQ_PACKAGE_MATERIALS.NEXTVAL INTO :NEW.ID FROM SYS.DUAL;
END IF;
END COLUMN_SEQUENCES;
END;
Но я считаю, что должен быть способ заставить EF делать все правильно самостоятельно. Здесь? А в чем собственно проблема? Заранее спасибо.
Если это имеет значение:
Entity Framework v6.1.2
Oracle .ManagedDataAccess v12.2.1100