Dlaczego pojawia się ten błąd: Nie określono mapowania dla następującego zestawu EntitySet / AssociationSet - Entity1?

96

Używam Entity Framework 4 z podejściem Model First.

Rozpocząłem projekt, zaprojektowałem encje i wygenerowałem bazę danych. Wszystko działało dobrze.

Potem musiałem wrócić i dodać kolejną jednostkę do mojego modelu. Jednak gdy przeciągam obiekt do EDMX, pojawia się ten błąd:

wprowadź opis obrazu tutaj

W porządku! Muszę tylko zmapować Entity1 do tabeli .. Ale hej! Używam podejścia Model First, spodziewam się, że utworzy dla mnie tabelę podczas generowania DDL.

Jak obejść ten błąd?

André Pena
źródło
1
Czy więc można wygenerować skrypt bazy danych z Twojego modelu?
Ladislav Mrnka

Odpowiedzi:

147

Dzieje się tak ze względu na sposób, w jaki EF4 działa z pierwszym modelem.

Podczas tworzenia pierwszego modelu model jest w stanie, w którym SSDL nie istnieje. Możesz przeciągać jednostki, kojarzyć je i tak dalej, ale jeśli spojrzysz na SSDL w pliku EDMX, zobaczysz, że żadna z jednostek nie ma skojarzonej tabeli magazynu w SSDL.

Zmienia się po kliknięciu Generate Database From Modelelementu menu kontekstowego. Mylące jest to, że ta czynność robi więcej niż tylko generowanie skryptu DDL. W rzeczywistości zmienia plik EDMX, aby zawierał informacje SSDL. Od tego momentu plik EDMX wejdzie w stan, w którym każda jednostka w projektancie / CSDL musi mapować do jednostki w SSDL. Jeśli nie zostanie zmapowane, spowoduje to błąd czasu kompilacji:

Nie określono mapowania dla następującego EntitySet / AssociationSet - (EntityName)

Innym interesującym faktem jest to, że nie jest to rodzaj błędu, który uniemożliwi kompilację. W rzeczywistości wygeneruje bibliotekę klas wyjściowych. Czy nie powinno to być ostrzeżenie czy coś takiego?

Aby zapobiec temu błędowi, wszystko, co musisz zrobić po wstawieniu nowego elementu, to Generate Database From Modelponownie. To zaktualizuje SSDL i naprawi mapowania.

EDYTOWAĆ

Jeśli nie używasz najpierw modelu i „aktualizujesz z bazy danych”, ten błąd wystąpi również w przypadku usunięcia tabeli na serwerze DB. Dzieje się tak, ponieważ Entity Framework nie usunie automatycznie jednostki za Ciebie. Usuń jednostkę ręcznie, a błąd zniknie.

André Pena
źródło
1
Otrzymałem ten sam problem po zaktualizowaniu mojego modelu pod kątem zmian bd (to nie może być dobre, ponieważ moje podejście nie jest oparte na modelu).
balanza,
5
@balanza, jeśli nie używasz najpierw modelu i aktualizujesz model w oparciu o bazę danych, ten błąd zostanie wyświetlony podczas usuwania tabeli na serwerze, ponieważ projektant EF NIE usunie jednostki automatycznie. Gdy ręcznie usuniesz typ jednostki, błąd zniknie
André Pena,
Zmieniłem moje bezpośrednio w pliku xml modelu danych jednostki. Miałem mnóstwo tabel i funkcji i istniało ryzyko niedopasowania, więc zrobiłem to ręcznie.
Bat_Programmer
To jest BARDZO pomocne. Ponadto, jeśli używasz najpierw modelu i „aktualizuj z bazy danych” i otrzymujesz nowe tabele, również wystąpi błąd. Ale uruchomienie Generuj bazę danych z modelu (nie trzeba faktycznie wykonywać wygenerowanego skryptu - zabije twoje dane!) Naprawi problemy z mapowaniem w twoim kodzie i nie będziesz mieć problemu z używaniem go dalej.
Brian Warshaw
1
Jak poradzisz sobie z aktualizacją schematu dla już wdrożonej bazy danych SQL Server CE? Można to przenieść do osobnego pytania, jeśli jest to całkowicie niezwiązana procedura
FYK
35

Okazało się, że pojawia się ten sam błąd, ponieważ zapomniałem utworzyć wiązanie referencyjne po utworzeniu skojarzenia między dwoma podmiotami.

Mal
źródło
13
Do Twojej wiadomości: Sprawdź właściwości powiązania, a na dole pole „Ograniczenie referencyjne” będzie puste. Kliknij wielokropek i utwórz wiązanie.
Patrice Calvé
To mi pomogło. Musiałem stworzyć relację 1 .. * z mojej encji początkowej do mojej jednostki nawigacyjnej.
duyn9uyen
21

Błąd 3027: Nie określono mapowania dla następującego zestawu EntitySet / AssociationSet ... ”- Bóle głowy Entity Framework

Jeśli tworzysz model z Entities Framework, czasami możesz napotkać ten irytujący błąd:

Błąd 3027: Nie określono mapowania dla następującego zestawu EntitySet / AssociationSet [nazwa jednostki lub skojarzenia]

Może to nie mieć sensu, gdy wszystko wygląda dobrze na EDM, ale to dlatego, że ten błąd zwykle nie ma nic wspólnego z EDM. Powinien powiedzieć „zregeneruj pliki bazy danych”.

Widzisz, jednostki sprawdzają SSDL i MSL podczas kompilacji, więc jeśli właśnie zmieniłeś EDM, ale nie używasz Generuj model bazy danych ... to narzeka, że ​​brakuje pewnych rzeczy w twoich skryptach sql.

tak więc, w skrócie, rozwiązanie jest następujące: „Nie zapomnij wygenerować modelu bazy danych za każdym razem po zaktualizowaniu EDM, jeśli najpierw opracowujesz model. Mam nadzieję, że problem został rozwiązany”.

Azeem ahmad
źródło
Ten pracował dla tego samego błędu robi Generowanie bazy model pomógł usunąć wyjątek
kolexinfos
7

W moim przypadku inny programista usunął niektóre tabele z podstawowej bazy danych. Kiedy zdałem sobie z tego sprawę i usunąłem te tabele z encji, problem został rozwiązany. Nie było tak oczywiste, jak się wydaje.

Graham Laight
źródło
6

Napotkałem ten sam błąd, ale nie używałem najpierw modelu. Okazało się, że w jakiś sposób mój plik EDMX zawiera odniesienie do tabeli, mimo że nie pojawiło się to w projektancie. Co ciekawe, gdy wyszukałem tekstowo nazwę tabeli w programie Visual Studio (2013), tabela nie została znaleziona.

Aby rozwiązać ten problem, skorzystałem z zewnętrznego edytora (Notepad ++), aby znaleźć odniesienie do nieprawidłowej tabeli w pliku EDMX, a następnie (ostrożnie) usunąłem wszystkie odniesienia do tabeli. Z przykrością stwierdzam, że w pierwszej kolejności nie wiem, jak plik EDMX znalazł się w tym stanie.

batpox
źródło
5

Miałem zmianę tabeli i utworzyłem kolejną jednostkę z numerem 1 na końcu (na przykład MyEntity1a MyEntity), co zostało potwierdzone przez przeglądarkę modeli edmx. Coś w tych dwóch bytach pomieszało przetwarzanie.

Usunięcie stołu i ponowne dodanie go naprawiło.


Zwróć uwagę, że jeśli TFS jest podłączony, po usunięciu wykonaj zaewidencjonowanie edmx. Wtedy i tylko wtedy pobierz najnowsze i dodaj je ponownie w określonym dwuetapowym procesie. W przeciwnym razie TFS jest mylony z usuwaniem i ponownym dodawaniem jednostek o tej samej nazwie, co wydaje się powodować problemy.

ΩmegaMan
źródło
Miałem ten sam problem po zmianie stołu. Znalazłem te same podmioty z numerami 1 i 2 (MyEntity1, MyEntity2) w kilku miejscach pod modelem. Zajrzałem do każdej gałęzi (Diagramy, Typy jednostek itp.) I usunąłem wszystkie wystąpienia MyEntity i MyEntity [n]. Na dokładkę zrobiłem „czyste rozwiązanie”, a następnie zaktualizowałem z bazy danych, aby ponownie dodać tylko MyEntity.
MsTapp
4

Szybszym sposobem było dla mnie usunięcie tabel i ponowne ich dodanie. Automatycznie je zmapował. :)

Atul K.
źródło
2

Dla tych, którzy używają Database Firstpodejścia, wszystko, co musisz zrobić po wstawieniu nowej encji, to Generate Database From Modelponownie kliknąć .edmxplik prawym przyciskiem myszy i wybraćGenerate Database From Model...

Masoud Darvishian
źródło
0

Wystąpił ten błąd podczas usuwania tabeli z bazy danych. Rozwiązano to, klikając prawym przyciskiem myszy diagram EDMX, przechodząc do Właściwości, wybierając tabelę z listy w oknie Właściwości i usuwając ją (za pomocą klawisza Delete) z diagramu.

miłość na żywo
źródło
0
  1. Przejdź do Eksploratora rozwiązań, kliknij przycisk Wyszukaj
  2. Zostaw zaznaczone zarówno Search within file contentiSearch External Files
  3. Wpisz nazwę jednostek, których mapowanie nie rozpoznaje.
  4. Usuń wszystkie pliki ZWIĄZANE z problemem. Te prawdopodobnie zostaną nazwane po tej samej zaginionej istocie. NIE usuwaj żadnych plików z nazwą klasy kontekstu w pliku, szczególnie jeśli ich rozszerzenia to .cs lub .tt. W pliku Context .cs .
  5. usuń wszystkie linie kodów odnoszące się do brakującego obiektu. Będą wyglądać tak:

    public virtual DbSet< Entity1> Entity1 { get; set; }

Ten błąd jest typowy dla tabel usuniętych z bazy danych.

web.config.connectionStringsProblem polega na porzuceniu tabeli w bazie danych lub po prostu zmianie dla bazy danych mapowanej EF, aby wskazywała na nową, a nie tę używaną do generowania oryginalnych mapowań.

To jest ta nowa baza danych, których te jednostki z błędem 3027 nie są obecne.

MarcoSantana
źródło
0

Wystąpił błąd, gdy próbowałem utworzyć niestandardowy wynik dla procedury składowanej i założyłem, że musi to być jednostka.

Rozwiązanie polegało na tym, że właśnie utworzyłem złożony typ w przeglądarce Modelu i przypisałem go jako wyniku do opcji „Edycja importu funkcji”.

Dodam to tutaj, ponieważ wygląda na to, że to pytanie dotyczy tego, dokąd Google zabierze Cię, gdy pojawi się ten błąd.

Thomas Koelle
źródło
0

Ustawiłem wszystko poprawnie (liczebności i właściwości zależne), ale nie mogłem zrozumieć, dlaczego ciągle otrzymuję błąd. Wreszcie zorientowałem się, że EF samodzielnie wygenerował kolumnę w tabeli zależnej (table_tablecolumn) i nie ma żadnej relacji z tabelą, więc nie określono mapowania. Musiałem usunąć kolumnę w pliku EDMX i odbudować rozwiązanie, które rozwiązało problem. Używam podejścia DB.

user2965957
źródło
0

Aktualizacja modelu z bazy danych nie działa dla mnie.

Musiałem usunąć skonfliktowaną jednostkę, następnie wykonać aktualizację modelu z bazy danych, na koniec odbudować rozwiązanie. Potem wszystko działa dobrze.

Willy David Jr
źródło
0

Udostępnianie tego innym osobom. W moim przypadku pracowaliśmy nad wspólnym rozwiązaniem MVC i używaliśmy wspólnego modułu dla tabel, których używamy do rozwijania. Otrzymałem błąd, gdy zaktualizowałem model Entity, dodając nową tabelę. Okazuje się, że kiedy zaktualizowałem EDMX, prawdopodobnie zaktualizowałem moje prawa dostępu do bazy danych, co skutkowało brakiem dostępu do tej tabeli dając mino mapping specified .

Samo ponowne dodanie i przyznanie dostępu mojemu użytkownikowi rozwiązało problem.

Godny podziwuVB
źródło
0

Myślę, że dostałem to, ponieważ nie usunąłem jawnie niektórych tabel z edmx przed zmianą nazwy i ponownym dodaniem ich. Zamiast tego po prostu zmieniłem nazwy tabel, a następnie wykonałem aktualizację modelu z bazy danych, myśląc, że znikną, i usunąłem je z modelu. Następnie wykonałem kolejną aktualizację modelu z bazy danych i dodałem tabele o zmienionych nazwach.

Witryna działała z nowymi tabelami, ale wystąpił błąd. W końcu zauważyłem, że oryginalne tabele nadal były w modelu. Usunąłem je z modelu (kliknij je na ekranie edmx, usuń klawisz), a następnie błąd zniknął.

apswrk
źródło