Mam problem z Entity Framework w Asp.net. Chcę uzyskać wartość Id za każdym razem, gdy dodam obiekt do bazy danych. W jaki sposób mogę to zrobić?
c#
entity-framework
entity
Ahmet
źródło
źródło
SaveChanges
od razu, aby uzyskać identyfikator. Więcej informacji tutaj .Odpowiedzi:
To całkiem proste. Jeśli używasz DB wygenerowane identyfikatory (jak
IDENTITY
w MS SQL) wystarczy dodać jednostceObjectSet
iSaveChanges
na związaneObjectContext
.Id
zostaną automatycznie wypełnione dla Ciebie:Entity Framework domyślnie następujące każda
INSERT
zeSELECT SCOPE_IDENTITY()
gdy auto generowaneId
są wykorzystywane s.źródło
Korzystałem z odpowiedzi Ladislava Mrnki, aby z powodzeniem odzyskać ID podczas korzystania z Entity Framework, ale piszę tutaj, ponieważ nie wykorzystałem go (tj. Nie wykorzystałem go) i pomyślałem, że opublikuję tutaj moje odkrycia w na wypadek, gdyby ludzie chcieli „rozwiązać” problem, który miałem.
Rozważ obiekt zamówienia, który ma relację klucza obcego z klientem. Kiedy jednocześnie dodałem nowego klienta i nowe zamówienie, robiłem coś takiego;
Jednak w moim przypadku nie było to wymagane, ponieważ miałem relację klucza obcego między klientem i identyfikatorem zamówienia a klientem
Musiałem tylko to;
Teraz, gdy zapiszę zmiany, identyfikator generowany dla klienta jest również dodawany do zamówienia. Nie potrzebuję dodatkowych kroków
Wiem, że to nie odpowiada na pierwotne pytanie, ale pomyślałem, że może to pomóc programistom, którzy są nowicjuszami w EF, nadużywać najczęściej głosowanej odpowiedzi na coś, co może nie być wymagane.
Oznacza to również, że aktualizacje są ukończone w ramach jednej transakcji, potencjalnie unikając danych orphin (albo wszystkie aktualizacje są ukończone, albo żadna nie).
źródło
Musisz ponownie załadować encję po zapisaniu zmian. Ponieważ został zmieniony przez wyzwalacz bazy danych, którego EF nie może śledzić. Więc musimy ponownie załadować byt z bazy danych,
Następnie
Spójrz na odpowiedź @jayantha w poniższym pytaniu:
Jak mogę uzyskać identyfikator wstawionego obiektu w strukturze Entity, gdy używasz defaultValue?
Pomocna może być odpowiedź @christian w poniższym pytaniu:
Entity Framework Odśwież kontekst?
źródło
.GetDatabaseValues();
jeśli właśnie zapisałeś swój model w bazie danych. Identyfikator powinien zostać automatycznie ponownie wypełniony do modelu.GetDatabaseValues()
gdyby nie znała identyfikatora obiektu, którego ma szukać w bazie danych?Proszę odnieść się do tego linku.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
Musisz ustawić właściwość StoreGeneratedPattern na tożsamość, a następnie wypróbować własny kod.
Możesz też tego użyć.
źródło
StoreGeneratedPattern
był dla mnie brakującym elementem.Zapisany obiekt powinien mieć poprawny
Id
format po propagowaniu zmian do bazy danych.źródło
Możesz uzyskać identyfikator dopiero po zapisaniu, zamiast tego możesz utworzyć nowego Guida i przypisać go przed zapisaniem.
źródło
Natrafiam na sytuację, w której muszę wstawić dane do bazy danych i jednocześnie wymagać podstawowego identyfikatora za pomocą struktury encji. Rozwiązanie :
źródło
Wszystkie odpowiedzi są bardzo dobrze dostosowane do ich własnych scenariuszy, co zrobiłem inaczej, to to, że przypisałem int PK bezpośrednio z obiektu (TEntity), który Add () zwrócił do zmiennej int takiej jak ta;
więc zamiast tworzyć cały nowy obiekt, po prostu bierz co chcesz :)
EDYCJA Dla pana @GertArnold:
źródło
Add
(jeśli tak jestDbSet.Add
) magicznie nie przypisuje wartościEmployeeId
.SaveChanges
. Niemożliwy. Chyba że masz jakiś inny proces, który przypisujeEmployeeId
, na przykład wEmployee
konstruktorze. LUB używasz EF coreForSqlServerUseSequenceHiLo
. W każdym razie nie dajesz całego obrazu.To zadziała.
źródło
Repository
jest, co jest. A „to zadziała” to jakieś wyjaśnienie!Istnieją dwie strategie:
Użyj wygenerowanej przez bazę danych
ID
(int
lubGUID
)Cons:
Powinieneś wykonać,
SaveChanges()
aby uzyskaćID
tylko zapisane elementy.Plusy:
Może używać
int
tożsamości.Użyj wygenerowanego przez klienta
ID
- tylko GUID.Plusy: minimalizacja
SaveChanges
operacji. Możliwość wstawienia dużego wykresu nowych obiektów na jedną operację.Cons:
Dozwolone tylko dla
GUID
źródło
Przy pierwszym użyciu kodu EF 6.x.
i zainicjuje tabelę bazy danych, umieści ona
wewnątrz właściwości tabeli pod nagłówkiem Wartość domyślna lub Powiązanie, umożliwiając zapełnianie identyfikatora podczas wstawiania.
Problem polega na tym, że tworzysz tabelę i dodajesz
część później, przyszłe aktualizacje baz danych nie dodają ponownie (newsequentialid ())
Poprawnym sposobem jest wyczyszczenie migracji, usunięcie bazy danych i ponowna migracja ... lub możesz po prostu dodać (newsequentialid ()) do projektanta tabel.
źródło
when -column- is NULL, then NEWID()