Entity Framework - Fügen Sie die Navigationseigenschaft manuell hinzu


115

Ich habe ein Entity Framework-Modell (4.0) aus meiner Datenbank generiert. Ich habe die Datenbank nicht entworfen und habe keine Kontrolle über das Schema, aber es gibt einige Tabellen, für die keine Fremdschlüsseleinschränkungen definiert sind, aber eine implizite Beziehung definiert ist.

Beispielsweise:

Ich habe eine Tabelle namens People mit den folgenden Spalten: GenderID RaceID

Es gibt Tabellen für Geschlecht und Rasse, aber es gibt keinen Fremdschlüssel in der Personentabelle.

Beim Importieren des Modells wurden keine Navigationseigenschaften für diese Beziehungen hinzugefügt. Ich habe versucht, es manuell hinzuzufügen, aber From Role und To Role sind deaktiviert. Ich bin mir nicht sicher, wie ich die Beziehung selbst hinzufügen soll. Wie mache ich das?

Antworten:


181

Ja - so einfach ist das nicht.

Folgendes tun Sie:

1 - Klicken Sie mit der rechten Maustaste auf den Designer, Hinzufügen -> Zuordnung

2 - Richten Sie die Assoziation und die Kardinalitäten ein (Personen * .. 1 Geschlecht, Personen * .. 1 Rasse)

3 - Gehen Sie in den Modellbrowser -> Zuordnungen

4 - Klicken Sie mit der rechten Maustaste auf Ihre neu erstellten Assoziationen und klicken Sie auf Eigenschaften

5 - Hier müssen Sie die Endpunkte für die Schlüssel- und Kaskadenoptionen einrichten. Stellen Sie sicher, dass die Endpunkte korrekt sind. Sie können hier auch eine referenzielle Einschränkung für Ihre implizite Navigationseigenschaft einrichten.

6 - Ordnen Sie die Navigationseigenschaft den relevanten Tabellen / Feldern zu.

7 - Validieren Sie Ihr Modell, drücken Sie die Daumen.

Hoffe das hilft.


20
+1 für das Speichern der Reste meiner Haare. Ich werde hinzufügen, dass # 6 das Ändern der Fremdschlüsselspalte auf der Eigenschaftenseite der Zuordnung, Einstellung "Referenzielle Einschränkung", erfordert. Klicken Sie auf [...], um das Dialogfeld für referenzielle Einschränkungen zu öffnen und das Dummy-Feld zu ändern, das der Designer unter Abhängige Eigenschaft in die untergeordnete Tabelle eingefügt hat.
Joel Brown

8
Sie müssen auch zu den Eigenschaften der untergeordneten Tabelle gehen und das Dummy-Feld löschen, das der Designer hinzugefügt hat (und das keinen realen Feldern in der untergeordneten Tabelle zugeordnet ist).
Joel Brown

2
Stellen Sie im Fall von Ansicht auch sicher, dass Sie Ihre Primärschlüsseldefinition richtig verstanden haben (klicken Sie mit der rechten Maustaste auf verwandte Felder auswählen und markieren Sie sie in den Eigenschaften als EntityKey). Andernfalls erhalten Sie möglicherweise "Multiplizität ist in Rolle in Beziehung nicht gültig, da sich die abhängige Rolle auf die Schlüsseleigenschaften bezieht ..."
Mikl X

1
Auf # 2 möchten Sie möglicherweise sicherstellen, dass das Kontrollkästchen "Fremdschlüsseleigenschaften zur Entität hinzufügen" deaktiviert ist. Das verursacht unnötige Kopfschmerzen, wenn Sie es wirklich nicht brauchen.
Verschlüsselung

Sobald Sie Ihr Modell erneut aus der Datenbank aktualisieren, behalten die Gerüstentitäten die manuell hinzugefügte Zuordnung bei.
Voodoo_Patch

45

Ich bin auf diesen Blog-Beitrag gestoßen, der die folgende Lösung vorschlägt, die für mich hervorragend funktioniert hat (leider konnte ich RPM1984 in meiner Situation nicht zum Laufen bringen).

  1. Fügen Sie eine Assoziation über den Designerhintergrund hinzu. Klicken Sie mit der rechten Maustaste auf das Kontextmenü
  2. Richten Sie Ihre Zuordnung ein (deaktivieren Sie unbedingt die Erstellung eines Fremdschlüssels)
  3. Klicken Sie mit der rechten Maustaste auf die Zuordnung und wählen Sie Eigenschaften
  4. Klicken Sie auf die ...Schaltfläche für die referenzielle Einschränkung
  5. Richten Sie die Beziehung zwischen den Schlüsseln ein
  6. Überprüfen Sie (aus dem Kontextmenü des Designers)
  7. ???
  8. Profitieren!

4
+1 Punkt 4 ließ mich es richtig machen, übersah das mit der RPM194 Antwort.
Hugo Logmans
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.