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.


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).


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>)

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.


5

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


1

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.