20

Nehmen wir an, dass wir diese Situation haben:Entity Framework (Database-First) mehrere Beziehungen zu derselben Tabelle Namenskonventionen steuern

Tabellen in der Datenbank:

Country (id, country_name), Person (id, login), CountryManager (id_country, id_person), CountryStakeholder (id_country, id_person)

Wenn wir das Modell erstellen hatte aus der Datenbank, Entity Framework Database-First Verwendung in VS würden wir eine Klasse wie haben dieses:

class Country { 

int id; 
string country_name; 

virtual ICollection<Person> Person1; // Navigation Properties 
virtual ICollection<Person> Person2; // ---------||---------- 

} 

Ich habe den Code sehr vereinfacht, aber hoffentlich hast du es verstanden.

Scheint, dass Entity Framework, wenn es mit Fremdschlüsseln handelt, generische Navigationseigenschaften erstellt. Gibt es eine Möglichkeit zu steuern, wie Navigationseigenschaften mit Namen erstellt werden? Person1, Person2 ist leider nicht sehr erklärend.

+1

Persönlich bevorzuge ich die Database-First-Methode. Und ich hatte viel Erfolg dabei. Ich erzwinge jedoch eine strenge Namenskonvention innerhalb meiner Datenbanken. Ich habe ein Dienstprogramm-Skript, das durch die Datenbank kräuseln und meine Fremdschlüssel umbenennen wird, um meiner Namenskonvention zu entsprechen. Zu der Zeit, wenn die FK zum EDMX kommen, machen ihre Namen Sinn. Daher macht der EDMX Sinn, und die T4s generieren Code, der Sinn ergibt. –

+1

Können Sie das Skript teilen? Ich denke, das wäre die nächste Option zur Lösung –

+1

@AdrianK. Hast du eine Lösung dafür gefunden? – Lijo

Antwort

1

In VS können Sie dies mit der GUI tun.

Wenn Sie Modell Browser zeigen dann den Baum navigieren nach unten zu:

YourEntityModel> Entity-Typen> Land

dann mit der rechten Maustaste auf den „Person1“ Navigation Eigentum und wählen Sie „Eigenschaften“ können Sie dann ändern der Name des Navigationseigenschaftsnamen zu, was auch immer Sie mögen:

enter image description here

einfach den Namen ändern, speichern Sie die Änderungen und fertig ...

(Tatsächlich gibt es viele Möglichkeiten, um die Navigation Objekteigenschaften-Fenster zu bekommen - Sie cn auch auf sie in dem Modelldiagramm der rechte Maustaste)

+3

Ich versuche, diese Methode zu vermeiden, denn wenn ich das Modell erneut aus der Datenbank regeneriere überschreibt es die 'Name' Eigenschaft, die Sie hier gezeigt haben –

0

Aus dem Eintrag „Working with Inverse Navigation Properties“ aus dem Buch „Programming Entity Framework: Code First“:

Sie können die Konfiguration (mithilfe von Datenanmerkungen oder der Fluent-API) hinzufügen, um diese Informationen dem Modellersteller bereitzustellen. Mit den Daten Anmerkungen verwenden Sie eine Anmerkung mit der Bezeichnung InverseProperty. Mit der fließenden API verwenden Sie eine Kombination der Has/With-Methoden zu , um die korrekten Enden dieser Beziehungen anzugeben.

Sie können die Anmerkungen an beiden Enden der Beziehung platzieren (oder beide Enden, wenn Sie möchten). Wir werden sie auf die Navigationseigenschaften in der Lodging-Klasse (Beispiel 4-10) kleben. Die InverseProperty-Daten Annotation benötigt den Namen der entsprechenden Navigationseigenschaft in der zugehörigen Klasse als Parameter.

Beispiel:

[InverseProperty("PrimaryContactFor")] 
public Person PrimaryContact { get; set; } 

[InverseProperty("SecondaryContactFor")] 
public Person SecondaryContact { get; set; } 
+0

Ist das update-sicher? Ich meine, wenn ich eine Spalte zur Tabelle hinzufüge und das Modell neu erzeuge, wird dies überschrieben? –

+2

Ich denke, dass das OP Database First verwendet? Er sagt: "Wenn wir das Modell aus der Datenbank in VS erstellen müssten ..." –

+1

Ich fürchte nicht; Das ist ein Nachteil bei der Verwendung des Database First-Ansatzes. – BCdotWEB

0

Ich empfehle, mit https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

Es ermöglicht mehr Flexibilität als jede Datenbank Generation, was ich gesehen habe. Ich arbeite immer noch daran, mein eigenes Problem zu lösen, aber das sieht ziemlich vielversprechend aus. Im Gegensatz zur von EF bereitgestellten Standardcodegenerierung können Sie das Mapping jedoch anpassen.

Wie in allen Beispielen, die ich beim Umbenennen der Navigationseigenschaften gesehen habe - das allein wird nicht genug sein, weil EF noch zugeordnet werden muss, um diese Navigationseigenschaften zu verwenden (Sie könnten es jedoch hacken und haben) Ihr User2 verweist beispielsweise auf ModifiedByUser).