Wpis z mikrobloga

Cześć mirki.

Mam takie pytanko.

Robimy sobie taki projekt i sytuacja wygląda tak, że klient frontowy przesyła mi json-y w postaci:


Następnie powinno to być przemielone przez kilka metod po stronie backendu, tak aby uzyskać z tego pewne informacje, potworzyć obiekty i przygotować do wysłania do bazy.

M.in. z w/w danych tworzone będą obiekty typu TreeNode, których klasa wygląda tak:

public class TreeNode
{
public int Id { get; protected set; }
public int ParentId { get; protected set; }
//tyle wystarczy dla uproszczenia.
}

Na chwilę obecną wygląda to tak, że pobieram ostatnio dodane Id, i na jego podstawie podczas rekurencyjnego wyciągania danych z json'a ustawiam odpowiednie id-ki. Generalnie powinna to być operacja bardzo szybko, ale co w sytuacji, kiedy:
- pobiorę ostatnie dodane do bazy id,
- na jego podstawie przydzielę węzłom odpowiednie id, oraz parentId,
- wyślę do bazy i.....

...w tym momencie połączenie przymuli, a w tym samym czasie ktoś inny również wykona taką samą operację, jednakże jego dane pójdą do bazy i w bazie będą już obiekty mające Id, które ja ustawiłem w swojej operacji.

Teoretycznie mógłbym wysyłać każdy węzeł osobno i za każdym nowym ustawianiem Id, sprawdzać jakie jest ostatnio dodane, jednakże tych węzłów może być za jednym razem np. 100, i wtedy byłoby 100 insertów, + 100 zapytań do bazy o Id, dlatego wolałbym tego uniknąć.

Ma ktoś pomysł jak można by ugryźć ten problem?

#csharp #programowanie #programista15k #aspnet
  • 6
W zasadzie, to wszystko i tak by szło w transakcji.
Korzystam z EntityFramework i właśnie dlatego chcę to wszystko upakować w odpowiednie kontenery i poprzez DbContext wypchać to wszystko razem, a z tego co mi się wydaje zajmowałaby się tym transakcja.

Ale wszystko nadal rozbija się o to, co kiedy dojdzie do sytuacji, o której wspomniałem wyżej.
Osoba A kliknie zapisz - z bazy dostanie odpowiedź, że ostatnie dodane ID to 100.
@pepepanpatryk: Jaka baza? W SQL Server jest coś takiego jak SEQUENCE i możesz sobie np. pobrać kolejne potrzebne Ci Id z sekwencji - kolejnej osobie już nie da tego samego. W celu optymalizacji można pobrać np. 10 Id na raz i kolejne dopiero jak wykorzystasz aktualne.
zastanawiałem się jeszcze jak baza mogła by nadać odpowiednie ID, oraz ParentId, bo w sumie nie wiedziała by, która encja jest w jakiej relacji z inną


@pepepanpatryk: nie pamiętam już jak EF bo dawno cokolwiek robiłem, ale NHibernate radzi sobie z tym całkiem dobrze