2011-08-03 11 views
5

Mam tabelę w bazie danych SQL Server, do której chcę dodać wiersz. Klucz podstawowy nie jest automatycznym inkrementowaniem i nie chcę, aby tak było. Jednak przy tej okazji chcę dodać wiersz z następną dostępną wartością. Czy istnieje prosty sposób na zrobienie tego? Wiem, że mógłbym zapytać w tabeli o maksymalną wartość, a następnie zwiększyć ją, ale czy jest łatwiejszy sposób korzystania z EF?.NET Entity Framework Dodaj nowy wiersz z przyrostowym kluczem podstawowym

Jeśli potrzebna jest osobna kwerenda, uzyskanie wartości MAX, w jaki sposób zrobiłbyś to z LINQ?

Odpowiedz

5

Byłoby to konieczne, chyba że serwer jest identyfikatorem lub kolumną obliczeniową, w takim przypadku można zrobić coś jak poniżej.

myRecord.ID = Context.Records.Max(record => record.ID) + 1; 
+1

Dzięki, że zadziałało. – Jonnster

3

Nie jest to łatwy sposób, szczególnie jeśli nalegasz na następną dostępną wartość (= brak przerw). Powinieneś użyć wartości auto increment, dzięki czemu twoja aplikacja będzie działać lepiej.

Na czym polega problem?

  1. Trzeba uzyskać wartość z bazy
  2. Musisz przypisać go do podmiotu
  3. Musisz zapisać podmiot do bazy

wygląda łatwo, nie jest to? Nie, nie jest tak, jeśli masz współbieżne środowisko, w którym więcej niż jeden wątek może wykonać krok 1. jednocześnie, zanim inne wątki osiągną krok 3. = wszystkie wątki wstawią rekord o tej samej wartości.

Jak sobie z tym poradzić? Jednym ze sposobów jest użycie osobnej tabeli z maksymalną wartością i operacją atomową, aby uzyskać i zwiększyć wartość. Myślę, że procedura przechowywana robi coś takiego powinno być atomowy:

DECLARE @Result INT 
UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...' 
RETURN @Result 

Wywołanie procedury przechowywanej powinny być na zewnątrz od każdej transakcji do jak najlepszego przepustowość.

Powinno to pozwolić na wygenerowanie unikatowych liczb, ale bez sekwencji bez przerw. Jeśli weźmiesz wartość przez taką operację i nie użyjesz tej wartości, zostanie ona utracona, a twoja sekwencja będzie zawierała lukę.

Jeśli nie chcesz luki, musisz ustawić wywołanie procedury składowanej i operację na transakcję, aby rekord w tabeli sekwencji był blokowany do czasu zatwierdzenia danych.

Powiązane problemy