2013-08-15 12 views
5

Mam metodę web api post, która wstawia nowy wiersz w mojej tabeli w mojej bazie danych Oracle. Mam problem z kluczem podstawowym tabeli, który jest wartością sekwencji. Jak zrobić my_primary_key_seq.nextval w Entity Framework? Obecnie ten kod działa, ale naruszy unikalne ograniczenie PK, gdy nowy wiersz zostanie wstawiony za pośrednictwem naszej starej formuły internetowej .net, która używa sekwencji następnej wartości jako następnego klucza podstawowego.Jak uzyskać wartość następnej sekwencji Oracle w .NET Entity Framework?

decimal nextPK = context.FORMPPs.OrderByDescending(p => p.PPID).FirstOrDefault().PPID + 1; 
item.PPID = nextPK; 
context.FORMPPs.Add(item); 
int result = context.SaveChanges(); 
+0

To tak naprawdę nie odpowiada na twoje pytanie, ale możesz również umieścić atrybut na własności ID twojej jednostki (na przykład: '[DatabaseGenerated (DatabaseGeneratedOption.Identity)]'), co spowoduje automatyczne wygenerowanie klucza głównego . Następnie możesz uzyskać identyfikator przypisany do nowego wiersza, pobierając wartość właściwości ID obiektu, po wywołaniu 'SaveChanges()'. –

+0

Mogę wstawić nowy wiersz używając, dodając 1 do bieżącego maksymalnego klucza podstawowego, ale nie powoduje to również zwiększenia wartości SEQUENCE, więc nawet jeśli aktualny kod działa, jeśli ktoś wstawi nowy wiersz za pomocą starej witryny internetowej .NET, to pęknie, ponieważ numer SEKWENCJI nie jest zsynchronizowany. – iCanObjSeeSharp

Odpowiedz

4

Miałem ten sam problem i rozwiązałem go przy pomocy tej witryny i Oracle. Zakładam, że używasz Database First, ponieważ wspomniałeś, że inna starsza aplikacja używa tej samej bazy danych.

Jest kilka rzeczy, które musiałem zrobić. Jak wspomniał Daniel Gabriel, jeśli pozwolisz Oracle zarządzać tożsamością, nie musisz nigdy wywoływać sekwencji, aby znaleźć numer, baza danych zajmie się nim za Ciebie. Ale uzyskanie tego do pracy było trochę trudne, ponieważ może być konieczne wprowadzenie kilku zmian w bazie danych.

  1. Utwórz sekwencję (już to zrobiono) w kolumnie tożsamości.

  2. Utwórz wyzwalacz, aby automatycznie wywoływać sekwencję po wstawieniu. http://www.oracle-base.com/articles/misc/autonumber-and-identity.php

  3. Zmiana modelu obiektu Entity. Byłem przy użyciu EF Database pierwsze, i znalazłem ten artykuł, który wyjaśnił, że muszę zmienić model, aby ustawić właściwość kolumny tożsamości stołu do

    StoreGeneratedPattern="Identity"

Oracle entity in VS entity framework doesnt update the primary key in code

  1. Ale nie podobało mi się to, że musiałem ponownie dodać tę zmianę za każdym razem, gdy odświeżałem swój model EF z bazy danych. Kliknij dwukrotnie plik .edmx, a następnie odszukaj tabelę w diagramie bazy danych, podświetl kolumnę tożsamości na diagramie, a następnie w oknie właściwości zmień wartość StoreGeneratedPattern na Tożsamość. To powinno sprawić, że będzie się utrzymywać nawet po aktualizacji modelu EF.
Powiązane problemy