Algorytm nadaje takie samo ID nowemu obiektowi, jaki miał ostatni w kolekcji usunięty obiekt

0

Ponieważ lubię obrazki, obrazkowo przedstawiam problem

user image
To powyżej to tak zwany happypath - encje są dodawane a następnie jedna (nie ostatnia) jest usuwana - każda kolejna encja i tak będzie mieć unikalne ID

user image
Natomiast to jest nopepath - ostatnia encja jest usuwana a potem dodajemy nową i .... ma to samo ID. W domyśle każda usunięta encja powinna mieć "dead ID" - czyli dane ID nie powinno być już nigdy używane.

Fragment kodu który to popełnia (baza danych MongoDB - brak enumeratora po stronie serwera, tak jak to jest w SQL)

                if (entity.Id == 0) {
                    var resultMax = this.collection.Find(e => true).SortByDescending(x => x.Id).FirstOrDefaultAsync().Result;
                    entity.Id = resultMax != null ? resultMax.Id + 1 : 1;
                }
                else {
                    var result = this.collection.Find(e => e.Id == entity.Id).ToListAsync().Result;

                    if (result.Count > 0) 
                        var resultMax = this.collection.Find(e => true).SortByDescending(x => x.Id).FirstOrDefaultAsync().Result;
                        entity.Id = resultMax != null ? resultMax.Id + 1 : 1;
                    }
                }
                this.collection.InsertOne(entity);
 

entity.id ------ typ int
collection ------zwykła kolekcja skrojona pod mongo, ma metody Find(), SortByDesc() - standard

  1. Prywatne pole statyczne odpada, bo i tak jego wartość będzie ginąć po zamknięciu aplikacji
  2. Zapisywanie wartości maxLastId do .xml raczej też odpada ^^
  3. Stworzenie Tuple<Collection, maxLastId> - dla danej kolekcji druga wartość będzie trzymać ostatni największy ID.

W core, chodzi po prostu o to, aby przy tworzeniu obiektów była możliwa tylko jedna i jedyna akcja: inkrementacja o 1.
Algorytm jednak odwołuje się do tutaj

.SortByDescending(x => x.Id).FirstOrDefaultAsync().Result;

do ostatniego obiektu który istnieje i jego id - i na postawie ID ostatniego "żyjącego" obiektu, tworzy się następny obiekt

 resultMax.Id + 1

Wszelka konstruktywna krytyka mile widziana

0

pytanie pierwsze a jak odpalisz to jednocześnie kilka razy to ile z tych id się powieli?

1 użytkowników online, w tym zalogowanych: 0, gości: 1