1

我阅读了很多关于它的内容,但没有找到任何帮助。

我的情况:我有两个属于一起的数据库表。我想用 EntityFramework 查询这些表。因为表 B 包含 EntityFramework 的鉴别器(用于为表 A 选择正确的类),所以我创建了一个连接表 A 和表 B 的视图。

这个连接很简单。但是:我也想用那个视图来存储数据。问题是,EntityFramework 也想存储鉴别器。但这是不可能的,因为它会更新/插入两个表。

所以我尝试创建一个“代替”触发器来更新/插入表 A(因为表 B 无关紧要并且永远不会更新)。

当我创建触发器时 - 一切都很好。如果我用 SQL 语句插入一些东西 - 一切都很好。但是:如果我直接在视图中插入(使用 Oracle SQL Developer),它会抛出如下异常:

ORA-22816(带有 RETURNING 子句的不受支持的功能)。

如果我对EntityFramework做同样的事情,我会得到同样的错误。有人能帮我吗?

在我的代码下方:

表 A 和表 B:

CREATE Table "TableA" 
(
 "ID" Number NOT NULL,
 "OTHER_VALUESA" varchar2(255),
 "TableB_ID" number not null,
 CONSTRAINT PK_TableA PRIMARY KEY (ID)
);

CREATE Table "TableB" 
(
 "ID" Number NOT NULL,
 "NAME" varchar2(255),
 "DISCRIMINATOR" varchar2(255),
 CONSTRAINT PK_TableB PRIMARY KEY (ID)
);

联合视图:

Create or Replace View "JoinTableAandB"
( 
  "ID",
  "OTHER_VALUESA",
  "TableB_ID",
  "DISCRIMINATOR"
) AS
select tableA.ID, tableA.OTHER_VALUESA, tableA.TableB_ID, tableB.DISCRIMINATOR
from TABLEA tableA
inner join TABLEB tableB on tableA.TableB_ID = tableB.ID;

最后是触发器:

create or replace TRIGGER "JoinTableAandB_TRG"
INSTEAD OF INSERT ON "JoinTableAandB"
FOR EACH ROW
BEGIN 
insert into TABLEA(OTHER_VALUESA, TABLEB_ID)
values (:NEW.OTHER_VALUESA, :NEW.TABLEB_ID);
END;

我也尝试过(验证插入是否正确,只是在触发器中输入“NULL”而不是插入。但得到了相同的错误消息。

有谁知道如何解决这个问题?或者有没有人有一个好的选择(更好的想法)?

谢谢!

注意:我还为 TableA 的 ID 定义了一个序列,以便它会自动生成。

// 编辑: 我找到了一个可能的 MS SQL 解决方案:

https://stackoverflow.com/a/26897952/3598980

但我不知道如何将其翻译为 Oracle ......我怎样才能从触发器中返回一些东西?

4

1 回答 1

0

注意:我还为 TableA 的 ID 定义了一个序列,以便它会自动生成。

在 Oracle 中的 EF StoreGenerated 键与 INSTEAD OF 触发器不兼容。EF 使用 RETURNING 子句输出存储生成的键,这不适用于 INSTEAD OF 触发器。

于 2017-12-05T14:01:09.080 回答