从实体框架中的 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 视图未添加。不是主键的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先 - 通过主键将子实体添加到父实体

如何在 Oracle 视图上添加主键? [复制]

视图和实体框架

使用实体框架自动编号

主键 mvc 实体框架模型错误

实体框架5与Oracle表/视图不存在不一致?