我面临着从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;
答案 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(),并且只依靠它是唯一的来解决这个问题。虽然,我不完全确定你如何使用这些数据,所以不确定将来是否会出现问题。