20

Załóżmy, że mamy taką sytuację:Entity Framework (bazy danych-First) wielokrotne stosunki do konwencji nazewnictwa sama tabela sterująca

tabel w bazie danych:

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

Gdybyśmy mieli stworzyć model z bazy danych, przy użyciu Entity Framework Database na pierwszej kondygnacji, w VS musielibyśmy klasę jak tym:

class Country { 

int id; 
string country_name; 

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

} 

Uprościliśmy kod, ale mam nadzieję, że masz rację.

Wydaje się, że gdy Entity Framework obsługuje klucze obce, tworzy ogólne właściwości nawigacji. Czy istnieje możliwość kontrolowania sposobu tworzenia właściwości nawigacji według nazwy? Person1, Person2 niestety nie jest zbyt wyjaśniający.

+1

Osobiście wolę korzystać z metodologii Database-First. I odniosłem wiele sukcesów z jego używania. Jednak wymuszam ścisłą konwencję nazewnictwa w moich bazach danych. Mam skrypt narzędziowy, który przeszukuje bazę danych i zmienia nazwę moich kluczy obcych, aby pasowały do ​​mojej konwencji nazewnictwa. Zanim FK dojdą do EDMX, ich nazwy rzeczywiście mają sens. W związku z tym EDMX ma sens, a T4 są w stanie wygenerować kod, który ma sens. –

+1

Czy możesz udostępnić skrypt? Myślę, że byłaby to najbliższa opcja rozwiązania: –

+1

@AdrianK. Czy znalazłeś rozwiązanie tego problemu? – Lijo

Odpowiedz

1

W VS można to zrobić za pomocą GUI.

Jeśli pokażesz modelu Browser następnie przejdź w dół drzewa do:

YourEntityModel> Typy Entity> Country

następnie kliknij prawym przyciskiem myszy na „PERSON1” Nawigacja Własności i wybierz „Właściwości” można następnie zmiana nazwa nazwa właściwości nawigacji do tego, co lubisz:

enter image description here

Wystarczy zmienić nazwę, zapisać zmiany i gotowe ...

(W rzeczywistości istnieje wiele sposobów, aby dostać się do okna właściwości Nawigacja Property - wy cn kliknij prawym przyciskiem myszy w modelu wykresie zbyt)

+3

Próbuję uniknąć tej metody, ponieważ jeśli ponownie wygeneruję model z bazy danych, nadpisze on właściwość 'Name', którą tutaj pokazano –

0

Od wejścia „Working with Inverse Navigation Properties” z książki „Programming Entity Framework: Code First”:

Możesz dodać konfigurację (przy użyciu Adnotacji danych lub Fluent API) , aby przedstawić te informacje konstruktorowi modeli. W przypadku Adnotacji danych użyjesz adnotacji o nazwie InverseProperty. Przy użyciu Fluent API użyjesz kombinacji metod Has/With z , określając prawidłowe końce tych relacji.

Możesz umieścić adnotacje po obu końcach relacji (lub , jeśli chcesz). Przykleimy je do właściwości nawigacji w klasie Zaopatrzenie (Przykład 4-10). Adnotacja InverseProperty Data wymaga nazwy odpowiedniej właściwości nawigacji w powiązanej klasie jako jej parametru.

Przykład:

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

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

Czy ta aktualizacja jest odporna na błędy? Mam na myśli, jeśli dodaję kolumnę do tabeli i zregeneruję model, czy zostanie ona nadpisana? –

+2

Myślę, że OP korzysta z bazy danych First? Mówi: "Gdybyśmy musieli stworzyć model z bazy danych w VS ..." –

+1

Obawiam się, że nie; to jedna wada z zastosowania podejścia Database First. – BCdotWEB

0

Polecam używanie https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

Pozwala to na większą elastyczność niż czymkolwiek generacji bazie widziałem. Nadal pracuję nad rozwiązaniem mojego własnego problemu, ale wygląda to całkiem obiecująco. Ale w przeciwieństwie do generowania domyślnego kodu, który zapewnia EF, można dostosować mapowanie.

Podobnie jak we wszystkich przykładach, które widziałem na temat zmiany właściwości nawigacji - samo to nie wystarczy, ponieważ EF nadal wymaga zmapowania, aby korzystać z tych właściwości nawigacji (można go jednak zhackować i twój punkt User2 do ModifiedByUser, na przykład).

Powiązane problemy