从实体框架中的Oracle查看不添加。不是主键

时间:2017-04-26 17:55:09

标签: sql entity-framework view oracle11g

我面临着从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;

2 个答案:

答案 0 :(得分: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。

希望这有帮助

答案 1 :(得分:0)

你可以在这里作弊。您不必在数据库中定义主键。但是,您需要在POCO的Entity Framework中定义主键。因此,您可以找出唯一标识记录的内容,然后使用POCO上的[Key]属性或通过Fluent API标记属于该主键的字段。如果您使用T4模板自动生成此功能,则必须手动将其添加到Fluent API。

如果你的主键不正确,如果两个记录以相同的键结束,它将会崩溃。

然而,主键不能是可空字段。如果没有可能的方法来唯一地识别这些数据,我只会在视图中返回一个新的Guid(),并且只依靠它是唯一的来解决这个问题。虽然,我不完全确定你如何使用这些数据,所以不确定将来是否会出现问题。