Entity Framework, Unique Columns, Handle Exception

Entity Framework, Unique Columns, Handle Exception
SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:minuta
  • Postów:1494
0

Witam. Mam takie pytanie odnośnie dodawania rekordu do bazy w aplikacji webowej. Powiedzmy, że jest aplikacja z której korzysta wielu użytkowników. Każdy może utworzyć nowy wpis w bazie danych (jedna konkretna tabela) która zawiera m.in pola Nr oraz Rok. Te dwa pola są oznaczone jako

Kopiuj
[Index("IX_FirstAndSecond", 1, IsUnique = true)]
public int Nr { get; set; }

[Index("IX_FirstAndSecond", 2, IsUnique = true)]
public int Rok { get; set; }

Czyli mamy unikalny zestaw Nr Rok.
Jak użytkownik kliknie aby utworzyć nowy wpis system najpierw pobiera z bazy ostatni numer w danym roku, zwiększa go o 1 i dodaje nowy rekord.
Teraz pytanie jak się zabezpieczyć przed sytuacją gdzie dwóch lub więcej userów dokładnie w tym samym czasie dodaje wpisy i dokładnie w tym samym czasie odczytują ostatnie wartości z bazy (wiem prawdopodobieństwo, że odpytują bazę dokładnie w tej samej ms jest małe) i powiedzmy, że system nada te same numery. Pierwszy zapisze się do bazy ale na kolejnym poleci Exception.
I przydało by się to jakoś obsłużyć bez zwracania userowi komunikatu tylko dać numer wyżej. Stosuje się w ogóle takie rozwiązania czy nie potrzebnie się tym przejmuje ? W przypadku rejestracji użytkownika jest łatwiej, bo można zwrócić komunikat, że login zajęty. Ale w przypadku generowania numeru przez system już nie bardzo.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

jak dostaniesz unique violation to przeprowadź procedurę raz jeszcze albo do skutku i tyle


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
AD
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:27
0

Skorzystaj z sekwencji do uzyskania numeru. Sekwencje w EF są obsługiwane.

abrakadaber
abrakadaber
Sekwencje mają dziury co przy numeracji dokumentów fiskalnych jest mocno niepożądaną cechą.
AD
Przy kasowaniu dokumentu ze środka też powstaną dziury w numeracji. Temat obszerny i można go rozwiązać na ileś sposobów. Kolega powyżej podał najszybsze i najprostsze do implementacji.
abrakadaber
abrakadaber
teoretycznie dokumentów fiskalnych nie kasujesz tylko anulujesz
abrakadaber
abrakadaber
BTW ciężko na sekwencji zrobić numerację roczną/miesięczną/wg typu dokumentu
AD
Jeśli w grę wchodzi numeracja w ramach czegoś to sekwencja nie za bardzo się nadaje. Można pomyśleć o tabeli numeratora w której będzie siedział ostatni numer w ramach czegoś. Trzeba tylko zadbać o to aby w momencie pobierania zwiększonego numeru nikt inny tego nie robił w tym samym czasie. Można założyć na ten moment na tabeli semafor. Może to niezgodne w filozofią EF ale za to skuteczne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.