5

Używam połączenia Entity Framework 4 do łączenia się z serwerem SQL 2008 w celu obsługi bazy danych dla mojej aplikacji.Jak uzyskać następny klucz podstawowy dla SQL 2008 w Entity Framework 4

Używam C# w Visual Studio 2010, a moje pytanie dotyczy pól klucza głównego, które są zwiększane przez sam SQL, czy w ogóle możliwe jest znalezienie identyfikatora, który będzie używany przez bazę danych .

Powodem, dla którego nie mogę po prostu znaleźć ostatniego przedmiotu i +1, jest to, że jeśli moja tabela zawiera pozycje 1,2,3,4 i 5, usuwając pozycję 5, to dodanie kolejnego spowoduje, że następny element stanie się pozycją 6, a niż 5 ponownie (Kiedy używam specyfikacji tożsamości w SQL, ale musi to być użyte).

Nie mogę znaleźć żadnej metody, takiej jak Item.ID.GetNextIdentity() lub coś podobnego, i przejrzałem tyle podobnych pytań, ale bez skutku.

Każda pomoc będzie mile widziane

+0

Czy to pytanie nie pomogło? http://stackoverflow.com/questions/2958921/entity-framework-4-how-to-find-the-primary-key –

+0

@Chris, patrzyłem na to, kiedy szukałem i nie wspomniało mi nic o następnym klucz, pytanie i odpowiedź wydawały mi się, że mówili o znalezieniu pola, które jest kluczem podstawowym, a nie następnym kluczem podstawowym, który będzie używany w tej dziedzinie. – JakeJ

+3

Co zamierzasz zrobić z kolejnym ID? Nawet jeśli znajdziesz sposób, aby go zdobyć, nie możesz być pewien, że to ** ty otrzymujesz identyfikator. –

Odpowiedz

9

Nie ma niezawodnego sposobu używania automatycznego inkrementowanego ID i pokazania go w formularzu przed dokonaniem zapisu. To jest zła architektura. Jeśli chcesz mieć ID pokazano przed zapisaniem formularz musi:

  • Nie używać auto zwiększane kolumnę jako ID i uchwyt wyjątkowość siebie
  • zapisać formularz natychmiast po uruchomieniu użytkownik tworząc go w pewnym początkowym stanie pustym i ostateczne potwierdzenie formularza będzie tylko aktualizować

Dlaczego nie możesz poprosić o kolejny identyfikator? Ponieważ jeśli robisz to w jakikolwiek sposób, nikt nie mówi, że otrzymany ID będzie naprawdę używany w twoim formularzu. Jeśli inny proces/wątek/aplikacja wstawi się pomiędzy otrzymaniem identyfikatora a utrwaleniem formularza, wyświetlony identyfikator zostanie przypisany do tego wstawionego formularza.

Również w przypadku korzystania z automatycznie zwiększanych kluczy podstawowych w bazie danych nie można przypisać wartości klucza w aplikacji - wartość nie zostanie wykorzystana, a baza danych może zastąpić ją własną.

-1

DBCC CHECKIDENT (table_name, NORESEED)

Zwraca bieżącą wartość tożsamości i aktualną maksymalną wartość kolumny tożsamości.

+0

Potrzebuję wykonać polecenie i użyć zwróconej wartości po stronie C# moja aplikacja korzystająca z Entity Framework 4, wydaje się, że polecenie to należy wykonać w SQL Query, a nie Entity Framework. Jeśli mogę to zrobić poprzez Entity Framework 4, nie wiem, jak będziesz musiał mi powiedzieć. – JakeJ

+0

To nie działa w warunkach wyścigu. – HLGEM

0

Zgadzam się z Ladislavem Mrnką, że taka funkcja może być potrzebna. Jedna sugestia obejścia to:

 // Insert existing object in data base via EF, but PK is missing ... 
     using (var Es = new MyEntities()) 
     { 
      try 
      { 
       // Allows you to get next pk 
       var e = new Model.TableXXX(); 
       // Set pk to existing entity which has no pk 
       existingEntity.PkField = e.PkField; 
       // Save existing object and let garbage collector take care 
       // of newly created entity 
       Es.TableXXX.AddObject(existingEntity); 
       Es.SaveChanges(); 
      } 
      catch (Exception ex) 
      { 
       // implement exception 
      } 
     } 
Powiązane problemy