2017-04-26 3 views
0

Ich habe Probleme, eine Sicht von Orakel zu Entitätsrahmen hinzuzufügen.Ansicht von Oracle in Entity Framework nicht hinzufügen. Nicht Primärschlüssel

Erstens war der Fehler, dass nicht aus den Spalten einen Primärschlüssel abgeleitet werden kann, so füge ich ein PK der Ansicht hinzu.

Jetzt wird gesagt, dass der Primärschlüssel nicht gültig ist, da ein Teil davon nullfähig ist.

Oracle Abfrage:

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; 
+1

Btw, in Oracle '' '' und 'NULL' sind ein und dasselbe. –

+0

Wenn Sie [this] (https://stackoverflow.com/q/28672956/861716) sehen, können Sie wahrscheinlich 'NVL (prozedur_name, objektname) '(oder koaleszieren) verwenden oder die Prozeduren ausfiltern, die nicht in einem Paket enthalten sind. –

Antwort

0

Sie können hier ein wenig betrügen. Sie müssen keinen Primärschlüssel in der Datenbank definiert haben. Sie müssen jedoch den Primärschlüssel innerhalb von Entity Framework für den POCO definieren. So können Sie einfach herausfinden, was einen Datensatz eindeutig identifiziert, und dann die Felder, die Teil dieses Primärschlüssels sind, entweder mit dem [Key] -Attribut auf dem POCO oder über die Fluent-API markieren. Wenn Sie dies automatisch mit T4-Vorlagen generieren, müssen Sie das manuell nur zur Fluent-API hinzufügen.

Wenn der Primärschlüssel falsch ist, stürzt er jedoch ab, wenn zwei Datensätze denselben Schlüssel haben.

Ein Primärschlüssel darf jedoch kein Nullwertfeld sein. Wenn es keinen möglichen Weg gibt, diese Daten eindeutig zu identifizieren, würde ich einfach eine neue Guid() in der Ansicht zurückgeben und mich darauf verlassen, dass dies einmalig ist, um dies zu umgehen. Allerdings bin ich nicht ganz sicher, wie Sie diese Daten verwenden, also nicht sicher, ob das ein Problem in der Zukunft sein würde.

+0

Ich füge es von EF Designer aus der Datenbank hinzu. Ich füge eine neue GUID hinzu, funktioniert aber immer noch nicht – DanielGatti

+0

Sie müssen den generierten Code für diese Ansicht ändern. Sie können keinen Primärschlüssel in einer Ansicht definieren. Daher wird EF nicht in der Lage sein, mit dieser Ansicht zu arbeiten. Der einzige Weg ist, EF manuell mitzuteilen, was der PK im Code ist. Der Generator wird Code, der ein PK enthält, nicht kennen/produzieren. –

0

Ich bin kürzlich auf das gleiche Problem gestoßen, als ich versuchte, eine VIEW in EF zu laden, wobei Oracle sein Bestes tat, um alle meine Tests zu zerstören, indem eine Spalte als NOT NULL angezeigt wurde.

Ich war endlich in der Lage, dies zu tun.

Erstellen einer neuen Tabelle

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); 

Dann eine Ansicht erstellen, die sowohl Ihre ursprüngliche Ansicht und diese neue Tabelle geben Sie haben

CREATE VIEW "GET_SPMONITORES_KEY" 
AS 
    select 
     my_key, sp 
     from key_table, GET_SPMONITORES 
     where my_key = 1 

Dies wird dann eine Ansicht:

describe "GET_SPMONITORES_KEY"; 

Name Null  Type   
------ -------- ------------- 
MY_KEY NOT NULL NUMBER   
SP    VARCHAR2(200) 

Sie können jetzt diesen GET_SPMONITORES_KEY in EF importieren und die my_key-Spalte afte ignorieren richtungen. Sie können diese Ansicht in beliebigen LINQ to SQL-Anweisungen ohne Probleme verwenden.

Ich habe eine Sicht, die die ID (PK) von 3 separaten Tabellen zurückgibt und ich bin in Lage, sie mit ihren entsprechenden Tabellen in meinen LINQ to SQL-Anweisungen zu verknüpfen, damit ich ihre entsprechenden EntityObjects zurückgeben kann.

Hoffe, das hilft

Verwandte Themen