2015-07-20 10 views
12

Uczymy się Entity Framework 6.1 (od NuGet), gdy oddalamy się od Linq2Sql. Mamy małą garść tabel, które kojarzą dwie oddzielne tabele, jak pokazano poniżej.Entity Framework 6 - Brakująca tabela z tylko kluczami głównymi odnoszącymi się do różnych tabel

EF6 Database Pierwsza generacja

DB Diagram:

enter image description here

Schema Przegląd:

enter image description here

Kiedy w studiach audiowizualny, pustej klasy biblioteki, robiąc Database Pierwszy EF6 Plik EDMX, diagram generuje tylko TableA i TableC - wykonuje TableB nie zostać wygenerowanym.

enter image description here

wizualna Studios Widok:

enter image description here

Widać, że tylko TABLEA i TableC są tworzone. Technicznie powinien zostać utworzony TableB, ponieważ chciałbyś móc zarządzać tymi referencjami.

Stowarzyszenie między A i C pokazano na rysunku:

enter image description here

czuję jak mi brakuje opcji, lub niezrozumienia kluczową koncepcję Entity Framework. Każdy pomysł, jak uzyskać brakujący TableB wygenerowany przy pomocy T4? Plik EDMX pokazuje to, ale z jakiegoś powodu nie jest generowany do pliku .CS z dwiema właściwościami wskazującymi związek.

Głównym powodem, dla którego tego potrzebujemy, jest rozszerzenie szablonu EF6 T4 w celu dodania wzorców fabrycznych do naszych istniejących modeli. Ponieważ nie generuje ona klasy dla TableB, nie otrzymujemy automatycznie wygenerowanego kodu, którego szukamy.

Myśli/sugestie? Dzięki.

+2

może EF rozumie, że tabela B nie ma własnego znaczenia i jest przeznaczona tylko dla relacji wielu do wielu? – Disappointed

Odpowiedz

5

Słabe podmioty lub łączenia tabel nie będą generowane przez EF, trzeba skonfigurować relacji ręcznie thru biegle API lub korzystając z adnotacji dane

Jak podano na stronie Microsoftu: w relacji w konwencji:

Uwaga: Jeśli masz wiele relacji między tymi samymi typami (na przykład , załóżmy, że definiujemy klasy Person i Book, gdzie klasa Person zawiera nawigację ReviewedBooks i właściwości i klasa Book zawiera właściwości nawigacyjne), aby ręcznie skonfigurować relacje za pomocą Adnotacji danych lub płynnego interfejsu API. Więcej informacji na temat można znaleźć w Adnotacje danych - Relacje i płynne API - Relacje.

Patrz tej link więcej informacji

AKTUALIZACJA

Rozwiązaniem będzie działać w przypadku EDMX (ale to koszt utrzymania) w następujący sposób:

  1. Usuń zagraniczny klucze z tabeli łączenia w bazie danych
  2. Zaktualizuj EDMX z bazy danych
  3. Odtworzenie kluczy obcych w tabeli łączącej

to rozwiązanie będzie działać tak długo, jak nie będzie ponownie aktualizować swój model z bazy danych.

Zalecane rozwiązanie, zachować wszystko jak było generowane przez EDMX i dowiedzieć się więcej o tym, jak korzystać z operacji CRUD dla tej sprawy przy użyciu następujących linków, które zostały zgłoszone „pomocne” przez użytkownika „@TravisWhidden”

  1. Insert/Update Many to Many Entity Framework . How do I do it?
  2. https://www.youtube.com/watch?v=uMQwORSTGX4 (wideo)
+0

Wygląda na to, że byłoby mi pomocne, gdybym użył pierwszej metody kodu --- ale ponieważ robimy "EF Designer z Database", nie mogę znaleźć w EDMX xml, w którym można ustawić płynne dane api lub adnotacje danych. – TravisWhidden

+0

@TravisWhidden możesz zrobić obejście, usunąć klucze podstawowe z tabeli join, a po wygenerowaniu edmx, odłożyć je z powrotem, a jeśli model nie działał, ponieważ tabela nie ma klucza głównego, usuń jeden z nich i spróbuj – Monah

+0

Usunięcie klucza podstawowego nie pomogło, ale usunięto ograniczenia klucza obcego. Jednak po ich przywróceniu i zobaczeniu, co się dzieje po naciśnięciu "aktualizacji z bazy danych", zwracane są skojarzenia w formacie XML, a po przejściu do dodania encji do tabeli, po SaveChanges(), zgłasza wyjątek ze względu na assoc przymus. Nie byłoby rozsądnym oczekiwać, że jakikolwiek deweloper w zespole pamięta o ręcznym usunięciu wszystkich powiązań z tabelami par, jeśli kiedykolwiek musiał "zaktualizować" plik EDMX. Tak więc, mimo że możliwe rozwiązanie, nadal domagają się bardziej konserwacji. – TravisWhidden

2

Jak wspomniano przez @Hadi Hassan, EF nie będzie „Expose” lub rozpoznać tabel relacyjnych, które składają się wyłącznie z innymi podmiotami.

obejść:
Jeśli tylko trzeba „czytać” dane można

  1. zdefiniować view w schemacie dla TableB.
  2. Następnie wykonaj aktualizację z DB Model (.EDMX) (wybierz widoki aktualizacji)
  3. Będziesz teraz mógł przesyłać zapytania do danych TableB przy użyciu kontekstu EF.

Jeśli trzeba zmodyfikować (Create, Update Destroy) zapisy w swoich TableB

  1. Tworzenie procedur przechowywanych w schemacie, odpowiednio.

  2. Importowanie PROC jako funkcja do Twojego modelu EF

  3. Teraz można nazwać te funkcje od Państwa modelu kontekst dla reszty swoich operacji CRUD.

Powiązane problemy