20

supponiamo che abbiamo questa situazione:Entity Framework (Database-First) molteplici relazioni a convenzioni di denominazione stessa tabella di controllo

tabelle nel database:

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

Se abbiamo dovuto creare il modello dal database, utilizzando Entity Framework Database-First, in VS avremmo una classe come questo:

class Country { 

int id; 
string country_name; 

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

} 

Ho semplificato molto il codice, ma spero che tu abbia capito il punto.

Sembra che quando Entity Framework si occupa di chiavi esterne crea proprietà di navigazione generiche. C'è la possibilità di controllare come vengono create le proprietà di navigazione per nome? Person1, Person2 non è molto esplicativo, sfortunatamente.

+1

Personalmente, preferisco utilizzare la metodologia Database-First. E ho avuto molto successo usandolo. Tuttavia, impongo una convenzione di denominazione rigida all'interno dei miei database. Ho uno script di utilità che ripple attraverso il database e rinominare le mie chiavi esterne per abbinare la mia convenzione di denominazione. Quando gli FK arrivano all'EDMX, i loro nomi hanno davvero un senso. Pertanto, l'EDMX ha senso, e le T4 arrivano a generare codice che abbia senso. –

+1

Puoi condividere lo script? Penso che sarebbe l'opzione più vicina alla soluzione –

+1

@AdrianK. Hai trovato una soluzione per questo? – Lijo

risposta

1

In VS è possibile farlo con la GUI.

Se si mostra Modello Browser poi spostarsi verso il basso l'albero per:

YourEntityModel> Tipi di entità> Paese

poi sul "Person1" Proprietà di navigazione e selezionare "Proprietà" tasto destro del mouse, è possibile modificare il nome del nome della proprietà di navigazione per quello che vuoi:

enter image description here

basta cambiare il nome, salvare le modifiche e hai fatto ...

(In realtà ci sono un sacco di modi per ottenere alla finestra Navigazione proprietà proprietà - si cn fare clic destro su di esso nella diagramma modello troppo)

+3

Sto cercando di evitare questo metodo perché se rigenero di nuovo il modello dal database, sovrascriverà la proprietà 'Name' che hai mostrato qui –

0

Dall'entrata "Working with Inverse Navigation Properties" dal libro "Programming Entity Framework: Code First":

È possibile aggiungere la configurazione (utilizzando Annotazioni dati o l'API Fluent) per presentare queste informazioni al generatore di modelli. Con le annotazioni dei dati , verrà utilizzata un'annotazione denominata InverseProperty. Con l'API Fluid , utilizzerai una combinazione dei metodi Has/With con per specificare i fini corretti di queste relazioni.

È possibile posizionare le annotazioni su entrambe le estremità della relazione (o entrambe le estremità se si desidera). Li incolleremo sulle proprietà di navigazione nella classe Alloggio (Esempio 4-10). The InverseProperty Data L'annotazione richiede il nome della proprietà di navigazione corrispondente in come parametro la classe correlata.

Esempio:

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

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

È a prova di aggiornamento? Voglio dire, se aggiungo una colonna al tavolo e rigeneri il modello, questo verrà sovrascritto? –

+2

Penso che l'OP stia usando Database First? Dice "Se dovessimo creare il modello dal database in VS ..." –

+1

ho paura di no; questo è uno svantaggio dall'uso dell'approccio First Database. – BCdotWEB

0

mi consiglia di utilizzare https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

Esso consente una maggiore flessibilità rispetto a qualsiasi cosa generazione del database che ho visto. Sto ancora lavorando per risolvere il mio problema, ma questo sembra piuttosto promettente. Tuttavia, a differenza della generazione del codice predefinito fornita da EF, è possibile personalizzare la mappatura.

Come, in tutti gli esempi che ho visto sul ridenominazione delle proprietà di navigazione, che da solo non sarà sufficiente, perché EF deve ancora essere mappato per utilizzare tali proprietà di navigazione (è possibile modificarlo, e avere il tuo utente2 punta a ModifiedByUser, per esempio).