Ma DefiningQuery, ale nie ma elementu InsertFunction… err

123

To mnie doprowadza do szału, a błąd jest dla mnie zupełnie bez znaczenia:

Nie można zaktualizować EntitySet „TableB”, ponieważ ma on DefiningQuery i nie ma elementu w elemencie do obsługi bieżącej operacji.

Moje tabele są ułożone w następujący sposób:

Tabela A.
int idA (tożsamość, klucz podstawowy)
...

Tabela B.
int idA (FK dla TableA.idA)
int val

TableB nie ma zdefiniowanego klucza podstawowego na serwerze SQL. Entity Framework zaimportował tabelę i skojarzenie oraz ustawił oba pola jako klucz. Ale wyświetli ten błąd, gdy spróbuję wstawić do tabeli!

Co jest nie tak??


Edycja: zgodnie z sugestią Alexa rozwiązanie było następujące:

  1. Kliknij prawym przyciskiem myszy plik edmx, wybierz Otwórz za pomocą, edytor XML
  2. Znajdź jednostkę w elemencie edmx: StorageModels
  3. Całkowicie usuń DefiningQuery
  4. Zmień nazwę sklepu: Schema = „dbo” na Schema = „dbo” (w przeciwnym razie kod wygeneruje błąd informujący, że nazwa jest nieprawidłowa)
  5. Usuń właściwość store: Name

Zostawiłem klucz tak, jak był, ponieważ było dla mnie OK, że obie kolumny są częścią klucza.

Palantir
źródło
6
Dziękujemy za aktualizację - instrukcje krok po kroku pomogły tej nowości EF w uruchomieniu aplikacji samouczka ASP.NET MVC!
Adam Neal
Dzięki za to! Miałem problem z tym, że EF nie wygenerował odpowiedniego pliku edmx dla tabeli serwera sql 2000, która ma klucz podstawowy. Ale ta instrukcja mnie uratowała :)
100r
4
3,5 roku później, a ten post nadal pomaga ppl, w tym przypadku ME! ... Do: Palantir za opisowy krok po kroku (zadziałał) i dzięki Alexowi >>> Brawo!
nanonerd
Rozwiązanie zadziałało dla mnie .. Dzięki
Delavega,
Sekret polegał na usunięciu „store:” z definicji schematu. Bardzo fajnie
Guilherme Ferreira

Odpowiedzi:

141

Cóż, gdy napotkano tabelę bez klucza podstawowego, jest ona traktowana jako widok.

Widoki pojawiają się w pliku EDMX (otwieranym w edytorze XML, aby zobaczyć) w elemencie StorageModel \ EntitySet [n] \ DefiningQuery.

Gdy masz DefiningQuery, jednostka staje się tylko do odczytu, chyba że dodasz funkcje modyfikacji. Potrzebujesz 3 funkcji modyfikacji (zwanych również procedurami składowanymi), po jednej dla każdej funkcji Wstaw, Aktualizuj i Usuń.

Ale masz dwie opcje:

Zmień definicję klucza:

  1. I przekonaj EF, że to, co myśli, jest widokiem, tak naprawdę jest stołem
  2. Lub dodaj odpowiednie funkcje modyfikacji

W twoim przypadku polecam (1).

Alex James
źródło
Wystąpił ten błąd, gdy próbowałem dodać jednostkę do tabeli skrzyżowań. Twoja sugestia rozwiązała problem, dzięki!
Walter Stabosz,
to jest doskonałe ..., Tnks
Mohan Gundlapalli,
Nie zapomnij kliknąć „Aktualizuj model z bazy danych” na swoim pliku .edmx, który wygenerowałeś z bazy danych jako pierwszy
Bashar Abu Shamaa
Mam ten sam problem, dziwna część jest taka, że ​​działa dobrze w naszym środowisku lokalnym i testowym, po prostu nie działa w środowisku klienta (nudne)
Mox Shah
13

Po prostu dodaj klucz podstawowy do tabeli. Otóż ​​to. Problem rozwiązany.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
Jebastin J
źródło
6

Brakowało mi klucza podstawowego w moim stole i pojawił się ten komunikat o błędzie. Jedną rzeczą, którą zauważyłem, było to, że po dodaniu klucza do tabeli musiałem wyczyścić tabelę z edmx za pomocą projektanta, zapisać edmx, a następnie zaktualizować go ponownie, aby dodać tabelę z powrotem. To nie było pobieranie klucza ponieważ został już przypisany jako widok. Nie wymagało to ręcznej edycji edmx.

mlapaglia
źródło
5

Dodaj klucz podstawowy do tabeli, usuń model z modelu edmx, następnie wybierz aktualizację z bazy danych, zbuduj i uruchom ...... działa


źródło
1

@Palantir. Sprawdź, czy obie tabele mają ustawione klucze podstawowe i zachowaj ostrożność w przypadku wielu kluczy podstawowych ustawionych w tabeli.

Paulo „PaulusHC” Gomes
źródło
0
  1. Musisz ręcznie otworzyć plik .EDMX w notatniku lub notatniku ++ lub w dowolnym wybranym edytorze tekstu.
  2. Znajdź wpis w edmx: StorageModels w pliku otwartym w kroku 1.
  3. Znajdź element DefiningQuery i całkowicie usuń ten tag.
  4. Znajdź sklep: Schema = "dbo" do Schema = "dbo" (jeśli pominiesz ten krok, wygeneruje błąd, że nazwa jest nieprawidłowa).
  5. Zapisz i zamknij plik.

Mam nadzieję, że to rozwiąże problem.

Brijesh Kumar Tripathi
źródło