2017-03-27 3 views
2

Ich habe eine übergeordnete Entität und eine untergeordnete Entität.Wie gebe ich den Fremdschlüssel in einer Eins-zu-Eins/Null-Beziehung an?

Im DB der Primärschlüssel für Eltern ist p_p_id und der Fremdschlüssel in dem Kind ist die gleiche p_p_id

Es in der Datenbank kein Fremdschlüssel ist.

Die Entitäten haben die Eigenschaften, die in ihren jeweiligen Klassen zueinander ausgerichtet sind.

Geordnete Klasse

public virtual ChildProject ThisChildProject { get; set; } 

Kinder Klasse

public virtual ParentProject ThisParentProjection { get; set; } 

Es gibt keine Anmerkungen zu diesen Eigenschaften noch auf der Ids der beiden Klassen.

In der Konfiguration habe ich versucht, das Mapping im Kind zu tun.

Was passiert ist, EF versucht, mit dem Primärschlüssel des untergeordneten Elements und dem Primärschlüssel des übergeordneten Elements zuzuordnen.

Aber ich mag eine definierte FK in dem Kind verwenden, und der Primärschlüssel der übergeordneten

+0

Die Art, wie Sie es definiert haben, ist nicht "Eins-zu-Viele/Null", sondern "Eins zu Eins/Null" - eine der Beziehungen, die EF nicht gut unterstützt. –

+0

Oh Mist. Entschuldigung für den Tippfehler. Sie haben 100% Recht – Smeegs

Antwort

1

Standardmäßig verwendet EF das so genannte Shared Primary Key Association, das die abhängige Entität PK als FK für die Principal Entity verwendet.

können Sie dieses Verhalten außer Kraft setzen, indem Sie den versteckt (Schatten) Name durch FK Angabe Map ->MapKey fließend Konfiguration:

HasRequired(e => e.ThisParentProject) 
    .WithOptional(e => e.ThisChildProject) 
    .Map(m => m.MapKey("p_p_id")); 

Update: Bitte beachten Sie die versteckt (Schatten) Wort. EF unterstützt keine explizite FK-Eigenschaft für diese Art von Beziehung - es gibt keine HasForeignKey fließende Methode, und das ForeignKey Attribut führt zu einem Fehler. Also, wenn Sie so etwas in Ihrer ChildProject Klasse:

[Column("p_p_id")] 
public int ThisParentProjectId { get; set; } 

Ich fürchte, die einzige Möglichkeit ist, um es zu entfernen und nur mit Navigationseigenschaften arbeiten.

+0

Hmmm. die folgende Ausnahme auslöst 'p_p_id: Name: Jeder Eigenschaftsname in einem Typ muss eindeutig sein. Der Name der Eigenschaft 'p_p_id' ist bereits definiert. ' – Smeegs

+0

Ah, also hast du ** explizite ** FK Feld wie 'public int p_p_id {get; einstellen; } '. Das ist, was ich im ersten Kommentar meinte - es wird nicht unterstützt (keine 'HasForeignKey' Methode), Sie sollten das explizite Feld entfernen und nur die Navigationseigenschaft lassen. –

+0

Hmmm. Ich muss das Mapping definieren, weil die Eigenschaft in der Klasse nicht den gleichen Namen wie die Spalte hat. – Smeegs

0

auf dem Eigenschaftsnamen Je, können Sie ein ForeignKey Attribut hinzufügen müssen, aber die Standard-Kollektion Erklärung ist in Ordnung:

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

Und hier ist One-One wie die aktualisierte Frage angefordert:

http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

+0

Wenn ich die zweiten Optionen versuche, bekomme ich die folgende Meldung "Multiplizität ist nicht gültig in der Rolle '' in der Beziehung ''.Da die Eigenschaften der abhängigen Rolle nicht die Schlüsseleigenschaften sind, muss die Obergrenze der Multiplizität der abhängigen Rolle '*' sein. ' – Smeegs

Verwandte Themen