从实体框架中的 Oracle 视图未添加。不是主键
Posted
技术标签:
【中文标题】从实体框架中的 Oracle 视图未添加。不是主键【英文标题】:View from Oracle in Entity Framework not adding. Not primary key 【发布时间】:2017-04-26 17:55:08 【问题描述】:我在将视图从 oracle 添加到实体框架时遇到问题。
首先,错误是无法从列中推断出主键,所以我在视图中添加了一个 pk。
现在说主键无效,因为它的一部分可以为空。
Oracle 查询:
CREATE VIEW ALERTEST."GET_SPMONITORES"
AS
select
CAST(NVL(procedure_name, '')AS VARCHAR(200)) AS SP
from all_procedures
where object_name = 'PAC_NL_MONITORES' AND procedure_name IS NOT NULL
;
ALTER VIEW GET_SPMONITORES
ADD CONSTRAINT GET_SPMONITORES_PK PRIMARY KEY (SP) DISABLE NOVALIDATE;
【问题讨论】:
顺便说一句,在 Oracle 中''
和 NULL
是一回事。
看到this你可能会使用NVL(procedure_name, object_name)
(或coalesce),或者过滤掉不在包中的程序。
【参考方案1】:
我最近遇到了同样的问题,试图将 VIEW 加载到 EF 中,而 Oracle 尽最大努力破坏了我在使列显示为 NOT NULL 时的所有测试。
我终于可以用这个来做到这一点了。
创建一个新表
CREATE TABLE "KEY_TABLE"
( "MY_KEY" NUMBER NOT NULL ENABLE,
CONSTRAINT "KEY_TABLE_PK" PRIMARY KEY ("MY_KEY")
);
INSERT INTO KEY_TABLE (MY_KEY) VALUES (1);
然后,创建一个既有原始视图又有这个新表的 VIEW
CREATE VIEW "GET_SPMONITORES_KEY"
AS
select
my_key, sp
from key_table, GET_SPMONITORES
where my_key = 1
这会给你一个视图:
describe "GET_SPMONITORES_KEY";
Name Null Type
------ -------- -------------
MY_KEY NOT NULL NUMBER
SP VARCHAR2(200)
您现在可以将此 GET_SPMONITORES_KEY 导入 EF,然后彻底忽略 my_key 列。您将能够在任何 LINQ to SQL 语句中使用此视图而不会出现任何问题。
我有一个返回 3 个单独表的 id (PK) 的视图,并且我能够在我的 LINQ to SQL 语句中将它们链接到它们对应的表,这样我就可以返回它们对应的 EntityObjects。
希望对你有帮助
【讨论】:
【参考方案2】:你可以在这里作弊一点。您不必在数据库中定义主键。但是,您确实需要在 Entity Framework 中为 POCO 定义主键。因此,您可以找出唯一标识记录的内容,然后使用 POCO 上的 [Key] 属性或通过 Fluent API 标记属于该主键的字段。如果您使用 T4 模板自动生成此内容,则必须仅手动将其添加到 Fluent API。
但是,如果您的主键不正确,如果两条记录最终具有相同的键,它将崩溃。
但是,主键不能是可为空的字段。如果没有可能的方法来唯一标识此数据,我将在视图中返回一个新的 Guid() 并依靠它的唯一性来解决这个问题。不过,我不完全确定您是如何使用这些数据的,所以不确定这是否会成为未来的问题。
【讨论】:
我是由 EF 设计器从数据库中添加的。我添加了一个新的 guid,但仍然无法正常工作 您必须更改此视图的生成代码。您不能在视图上定义主键。因此,EF 将无法使用该视图。解决这个问题的唯一方法是手动告诉 EF 代码中的 PK 是什么。生成器不会知道/生成其中包含 PK 的代码。以上是关于从实体框架中的 Oracle 视图未添加。不是主键的主要内容,如果未能解决你的问题,请参考以下文章