Korzystam z Entity Framework 1 z .net 3.5.
Robię coś takiego prostego:
var roomDetails = context.Rooms.ToList();
foreach (var room in roomDetails)
{
room.LastUpdated = DateTime.Now;
}
Otrzymuję ten błąd, gdy próbuję:
context.SaveChanges();
Dostaję błąd:
Nie można zaktualizować EntitySet - ponieważ ma on DefiningQuery i nie istnieje element <UpdateFunction> w elemencie <ModificationFunctionMapping> w celu obsługi bieżącej operacji.
Robię wiele aktualizacji w kontekście i nie mam żadnych problemów, tylko wtedy, gdy próbuję zaktualizować ten konkretny byt.
Całe moje wyszukiwanie pokazuje to samo, że nie ma zadeklarowanego klucza podstawowego w encji, którą próbuję zaktualizować. Ale niestety mam zadeklarowany klucz podstawowy ...
Odpowiedzi:
Zwykle dzieje się tak, ponieważ jeden z następujących powodów:
Po wykonaniu tej czynności może być konieczne zaktualizowanie w projektancie Entity Framework (lub alternatywnie usunięcie encji, a następnie dodanie jej), zanim przestanie się pojawiać błąd.
źródło
Wystarczy dodać klucz podstawowy do tabeli. Otóż to. Problem rozwiązany.
źródło
Tak jest w moim przypadku. Samo usunięcie spowodowało kolejny błąd. Postępowałem zgodnie z krokami tego postu oprócz ostatniego. Dla Twojej wygody skopiowałem 4 kroki z posta, które śledziłem, aby rozwiązać problem w następujący sposób:
store:Schema="dbo"
, abySchema="dbo"
(w przeciwnym razie kod wygeneruje błąd mówiąc, że nazwa jest niepoprawna)źródło
Pamiętaj, że być może twoja jednostka ma klucz podstawowy, ale twoja tabela w bazie danych nie ma klucza podstawowego .
źródło
AKTUALIZACJA: Ostatnio otrzymałem kilka pozytywnych opinii na ten temat, więc pomyślałem, że dam znać ludziom, że poniższe porady nie są najlepsze. Odkąd zacząłem się zastanawiać, wykonując Entity Framework na starych bazach danych bezkluczykowych, zdałem sobie sprawę, że najlepszą rzeczą, jaką możesz zrobić BY FAR, jest zrobienie tego przez odwrócenie kodu. Istnieje kilka dobrych artykułów na ten temat. Postępuj zgodnie z nimi, a następnie, jeśli chcesz dodać klucz, użyj adnotacji danych, aby „sfałszować” klucz.
Załóżmy na przykład, że wiem, że mój stół
Orders
, chociaż nie ma klucza podstawowego, gwarantuje, że będzie miał tylko jeden numer zamówienia na klienta. Ponieważ są to dwie pierwsze kolumny w tabeli, ustawiłem pierwsze klasy kodu, aby wyglądały następująco:Robiąc to, w zasadzie sfałszujesz EF, aby uwierzyć, że istnieje klastrowany klucz złożony z OrderNumber i Customer. Umożliwi to wykonywanie wstawek, aktualizacji itp. W tabeli bezkluczykowej.
Jeśli nie jesteś zbyt zaznajomiony z robieniem kodu w pierwszej kolejności, znajdź dobry samouczek na temat Entity Framework Code First. Następnie znajdź jeden w Odwróć kod pierwszy (który robi kod pierwszy z istniejącą bazą danych). Więc po prostu wróć tutaj i ponownie spójrz na moją kluczową radę. :)
Oryginalna odpowiedź :
Po pierwsze: jak powiedzieli inni, najlepszą opcją jest dodanie klucza podstawowego do tabeli. Kropka. Jeśli możesz to zrobić, nie czytaj dalej.
Ale jeśli nie możesz lub po prostu nienawidzisz siebie, istnieje sposób, aby to zrobić bez klucza podstawowego.
W moim przypadku pracowałem ze starszym systemem (pierwotnie płaskie pliki na AS400 przeniesione do Access, a następnie przeniesione do T-SQL). Musiałem więc znaleźć sposób. To jest moje rozwiązanie. Poniższe działało dla mnie przy użyciu Entity Framework 6.0 (najnowsza wersja NuGet w chwili pisania tego tekstu).
Kliknij prawym przyciskiem myszy plik .edmx w Eksploratorze rozwiązań. Wybierz „Otwórz za pomocą ...”, a następnie wybierz „Edytor XML (tekst)”. Będziemy tutaj ręcznie edytować automatycznie wygenerowany kod.
Poszukaj takiej linii:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">
Usuń
store:Name="table_name"
z końca.Zmień
store:Schema="whatever"
naSchema="whatever"
Spójrz poniżej tego wiersza i znajdź
<DefiningQuery>
tag. Będzie miał w nim dużą, starą instrukcję. Usuń tag i jego zawartość.Teraz twoja linia powinna wyglądać mniej więcej tak:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />
Mamy coś jeszcze do zmiany. Przejrzyj plik i znajdź to:
<EntityType Name="table_name">
W pobliżu prawdopodobnie zobaczysz komentarz z ostrzeżeniem, że nie zidentyfikowano klucza podstawowego, więc klucz został wyprowadzony, a definicja jest tabelą / widokiem tylko do odczytu. Możesz go zostawić lub usunąć. Usunąłem to.
Poniżej znajduje się
<Key>
tag. Tego właśnie używa Entity Framework do wstawiania / aktualizacji / usuwania. UPEWNIJ SIĘ, ŻE ROBISZ PRAWO. Właściwość (lub właściwości) w tym znaczniku muszą wskazywać jednoznacznie identyfikowalny wiersz. Załóżmy na przykład, że wiem, że mój stółorders
, chociaż nie ma klucza podstawowego, gwarantuje, że będzie miał tylko jeden numer zamówienia na klienta.Mój wygląda więc tak:
Poważnie, nie róbcie tego źle. Powiedzmy, że chociaż nigdy nie powinno być duplikatów, jakoś dwa wiersze dostają się do mojego systemu z tym samym numerem zamówienia i nazwą klienta. Whooops! To właśnie dostaję za nieużywanie klucza! Więc używam Entity Framework, aby go usunąć. Ponieważ wiem, że duplikat jest jedynym zamówieniem złożonym dzisiaj, robię to:
Zgadnij co? Właśnie usunąłem zarówno duplikat, jak i oryginał! Dzieje się tak, ponieważ powiedziałem Entity Framework, że numer_kolejny / nazwa_komeru to mój klucz podstawowy. Więc kiedy powiedziałem mu, aby usunąć duplikat zamówienia, to w tle było coś takiego:
I z tym ostrzeżeniem ... powinieneś już iść!
źródło
Może się to również zdarzyć, jeśli model danych jest nieaktualny.
Mam nadzieję, że uratuje to frustrację kogoś innego :)
źródło
Otrzymywałem ten sam komunikat o błędzie, ale w moim scenariuszu próbowałem zaktualizować jednostki wyprowadzone z relacji wiele do wielu przy użyciu PJT (Pure Join Table).
Po przeczytaniu innych postów pomyślałem, że mogę to naprawić, dodając dodatkowe pole PK do tabeli łączenia ... Jednak jeśli dodasz kolumnę PK do tabeli łączenia, nie będzie to już PJT i stracisz wszystkie zalety struktury encji, takie jak automatyczne mapowanie relacji między jednostkami.
Tak więc rozwiązaniem w moim przypadku była zmiana tabeli łączenia na DB, aby utworzyć PK, który zawiera OBIE kolumny z zagranicznym identyfikatorem.
źródło
może wystąpić błąd, jeśli tabela nie ma klucza podstawowego, w tym przypadku jest ona „tylko do odczytu”, a komenda db.SaveChanges () zawsze spowoduje błąd
źródło
Ustaw klucz główny, a następnie zapisz tabelę i odśwież, a następnie przejdź do Model.edmx usuń tabelę i uzyskaj ponownie.
źródło
więc to prawda, po prostu dodaj klucz podstawowy
Uwaga: upewnij się, że podczas aktualizacji diagramu EF z bazy danych wskazujesz na właściwą bazę danych, w moim przypadku ciąg połączenia wskazywał na lokalną bazę danych zamiast aktualnej bazy danych deweloperów, uczeń błąd wiem, ale chciałem to opublikować, ponieważ może być bardzo frustrujące, jeśli jesteś przekonany, że dodałeś klucz podstawowy i nadal pojawia się ten sam błąd
źródło
Miałem ten sam problem. Jak powiedział ten wątek: Moja tabela nie miała PK, więc ustawiłem PK i uruchomiłem kod. Niestety błąd pojawił się ponownie. Następnie usunąłem połączenie DB (usuń plik .edmx w folderze Model Eksploratora rozwiązań) i ponownie je utworzyłem. Błąd zniknął po tym. Dziękujemy wszystkim za podzielenie się swoimi doświadczeniami. Oszczędza dużo czasu.
źródło
Dostawałem ten problem, ponieważ generowałem mój EDMX z istniejącej bazy danych (zaprojektowanej przez kogoś innego i używam tutaj terminu „zaprojektowany” luźno).
Okazało się, że stół nie miał żadnych kluczy. EF generował model z wieloma wieloma kluczami. Musiałem dodać klucz podstawowy do tabeli db w SQL, a następnie zaktualizować mój model w VS.
To naprawiło to dla mnie.
źródło
To nie jest nowa odpowiedź, ale pomoże komuś, kto nie jest pewien, jak ustawić klucz podstawowy dla swojej tabeli. Użyj tego w nowym zapytaniu i uruchom. Spowoduje to ustawienie kolumny UniqueID jako klucza podstawowego.
źródło
W moim przypadku zapomniałem zdefiniować Podstawowy klucz do tabeli. Więc przypisz jak pokazano na obrazku i odśwież tabelę z „Aktualizuj model z bazy danych” z pliku .edmx. Mam nadzieję, że to pomoże !!!
źródło
Dodanie klucza podstawowego również mi działało!
Gdy to zrobisz, oto jak zaktualizować model danych bez usuwania go -
Kliknij prawym przyciskiem myszy stronę projektanta encji edmx i „Aktualizuj model z bazy danych”.
źródło
Miałem dokładnie ten sam problem, niestety dodanie klucza podstawowego nie rozwiązuje problemu. Oto jak rozwiązuję mój:
primary key
na stole, więc zmienię swój stół i dodam klucz podstawowy.Delete the ADO.NET Entity Data Model
(plik edmx), którego używam do mapowania i łączenia się z moją bazą danych.Add again a new file of ADO.NET Entity Data Model
do połączenia z moją bazą danych i do mapowania właściwości mojego modelu.Clean and rebuild the solution.
Problem rozwiązany.
źródło
po prostu dodaj klucz podstawowy do swojego stołu, a następnie ponownie utwórz EF
źródło
Musiałem tylko usunąć tabelę z modelu i zaktualizować model ponownie, przywracając tabelę. Wydaje mi się, że klucz główny został utworzony po wciągnięciu tabeli do modelu.
źródło
Pojawił się ten problem i uważam, że był on spowodowany, ponieważ usunąłem Indeks z klucza podstawowego moich tabel i zastąpiłem go indeksem niektórych innych pól w tabeli.
Po usunięciu indeksu klucza podstawowego i odświeżeniu edmx, wstawki przestały działać.
Odświeżyłem tabelę do starszej wersji, odświeżyłem edmx i wszystko działa ponownie.
Powinienem zauważyć, że kiedy otworzyłem EDMX w celu rozwiązania tego problemu, sprawdzając, czy zdefiniowano klucz podstawowy, tak było. Żadna z powyższych sugestii mi nie pomogła. Ale odświeżenie indeksu klucza podstawowego wydawało się działać.
źródło
Otwórz plik .edmx w edytorze XML, a następnie usuń znacznik z tagu, a także zmień sklep: Schema = "dbo" na Schema = "dbo" i odbuduj rozwiązanie, teraz błąd zostanie rozwiązany i będziesz mógł zapisać dane.
źródło
Znalazłem oryginalną odpowiedź dotyczącą aktualizacji pliku .edmx najlepiej w mojej sytuacji. Po prostu nie byłem zbyt szczęśliwy z powodu zmiany modelu za każdym razem, gdy był aktualizowany z bazy danych. Dlatego napisałem dodatkowy plik szablonu tekstowego, który jest automatycznie wywoływany, gdy po zmianie modelu - podobnie jak encje są generowane ponownie. Zamieszczam to tutaj w tym komentarzu. Aby to działało, upewnij się, że nadasz mu nazwę {nazwa modelu} .something.tt i przechowujesz go w tym samym folderze co folder .edmx. Nazwałem to {nazwa modelu} .NonPkTables.tt. Sam nie generuje pliku z powodu niepoprawnej definicji rozszerzenia pliku w drugim wierszu. Zapraszam do korzystania.
źródło
Napotkałem ten sam komunikat o błędzie, aby wstawić rekord do tabeli mającej relację wiele do wielu . Mój schemat bazy danych to:
Tabela Student i zajęć mają klucze podstawowe identyfikator i kod odpowiednio , podczas gdy tabela Student Kurs ma dwa klucze obce odwzorowanych z tabelami Studenckich i kurs.
Logicznie schemat jest poprawny, ale popełniłem błąd w bazie danych, ponieważ każda tabela powinna mieć klucz podstawowy.
Moja definicja SQL dla kursu studenckiego brzmiała:
Uczyniłem parę kluczy obcych kluczem podstawowym tej tabeli i zaktualizowałem do:
Mam nadzieję, że rozwiąże to problemy niektórych facetów.
źródło