Ponieważ lubię obrazki, obrazkowo przedstawiam problem
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
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
- Prywatne pole statyczne odpada, bo i tak jego wartość będzie ginąć po zamknięciu aplikacji
- Zapisywanie wartości maxLastId do .xml raczej też odpada ^^
- 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