Autonumeracja podczas wstawiania, usuwania lub modyfikacji danych

0

Czy Entity Framework Core udostepnia jakąs funcjonalność autonuemracji rekordów w ramach jakiejs grupy? Już tłumacze o co mi chodzi. Mam np takie proste klasy

public class User
{
  public int Id { get; set; }
  public string Firstname { get; set; }
  public string Lastname {get;set;}
  public List<UserBooks> Books{get;set;}
}

public class UserBook
{
  public int Lp { get; set; }
  public int UserId { get; set; }
  public string Name{get;set;}
 public DateTime Date {get;set;}
}

Chciałbym teraz wrzucić to do bazy danych. Mniej więcej wiem jak to zrobić przy uzyciu dbcontext. Problem tkwi w tym ze chcialbym aby własiwośc Lp w klasie UserBok przeliczała się przy wstawianiu/usuwaniu/aktualizacji obiektów tej klasy. Ma to być numer sekwencyjny w ramach UserId. Nie wiem czy jasno opisałem co chce osiągnąć. Z grubsza chodzi o to ze jak mam np w bazie User1 i User2 i mają oni odpowiedni 3 i 4 ksiazki to numeracja ksiazek przynaleznych User1 idzie od 1 do 3 a przynaleznych User2 idzie od 1 do 4. Chciałbym zeby takie przeliczenie odbywało się właśnie przy wstawianiu/usuwaniu/aktualizacji tak zeby numery pozycji były zawsze ciagłe i aktualne, a idealnie by było zeby ta autonumeracja uwzgledniła date dodania ksiazki (własciwosć Date).
Jestem w stanie osiągnąć to jakoś? Podejrzewam ze trzeba pogrzebac w metodzie Configure kontekstu, ale proszę o jakieś wskazówki.

3

A gdyby po prostu ją tam samemu wstawić?

userbook.Lp = _context.UserBooks.Count(x => x.UserId == Id) + 1;

lub

userbook.Lp = user.Books.Count() / Count + 1;

Chociaż generalnie nie wstawiałbym Lp do bazy, bo to element widoku. Dodawałbym je przy zwracaniu na widok - no wiesz, sortujesz zwracane Books po dacie i nadajesz im numeracje Lp.

btw. Czy ten UserBook nie powinien posiadać Id Booka?

1
kalimata napisał(a):

Czy Entity Framework Core udostepnia jakąs funcjonalność autonuemracji rekordów w ramach jakiejs grupy?

EF Core to ORM, biblioteka służąca do mapowania obiektów na relacje i z powrotem. Nie do realizacji logiki biznesowej.

Chciałbym teraz wrzucić to do bazy danych. Mniej więcej wiem jak to zrobić przy uzyciu dbcontext. Problem tkwi w tym ze chcialbym aby własiwośc Lp w klasie UserBok przeliczała się przy wstawianiu/usuwaniu/aktualizacji obiektów tej klasy. Ma to być numer sekwencyjny w ramach UserId.

To, że użytkownik może numerować swoje książki, i że numeracja musi być ciągła, to jest właśnie logika biznesowa. (O ile wynika z wymagań biznesowych tworzonej aplikacji.)

Nie wiem czy jasno opisałem co chce osiągnąć. Z grubsza chodzi o to ze jak mam np w bazie User1 i User2 i mają oni odpowiedni 3 i 4 ksiazki to numeracja ksiazek przynaleznych User1 idzie od 1 do 3 a przynaleznych User2 idzie od 1 do 4. Chciałbym zeby takie przeliczenie odbywało się właśnie przy wstawianiu/usuwaniu/aktualizacji tak zeby numery pozycji były zawsze ciagłe i aktualne, a idealnie by było zeby ta autonumeracja uwzgledniła date dodania ksiazki (własciwosć Date).

Jeżeli tak faktycznie ma być, to wypadałoby utworzyć sobie klasę UsersBookCollection, która by pilnowała numeracji książek, które zawiera.

Ale na 80% próbujesz rozwiązać problem X/Y, a Twoim celem jest tak naprawdę wyświetlenie tego w GUI programu. A w takim przypadku w ogóle nie potrzebujesz do tego zmieniać backendu ani bazy.

0

@WeiXiao: @somekind Dziękuję za odpowiedzi. To co przedstawiłem to tylko taki przykład, nie miałem pomysłu na lepszy. Próbuje opanować sytuację gdy kolejność ma znaczenie czyli ze elementy powinny się wyświetlać w takiej kolejności w jakiej zostaną wstawiona a użytkownik moze dodatkowo zmieniac kolejność, stad ten Lp w tabeli z elementami.

@somekind czy ta klasa UsersBookCollection musiałaby być mapowana na tabele w bazie?

0

Raczej nie bezpośrednio, bo to klasa z warstwy logiki biznesowej.

0

Próbuje opanować sytuację gdy kolejność ma znaczenie czyli ze elementy powinny się wyświetlać w takiej kolejności w jakiej zostaną wstawiona

Jeśli stworzysz sobie klucz główny np. jako Id, to możesz posortować wyświetlane elementy po Id. Zakładając, że będą dodawane do bazy po kolei, będą automatycznie numerowane.
Wystarczy, że utworzysz nowy obiekt

var user = new User();
user.FirstName = "Robert";
user.LastName = "Kowalski";
_context.Users.Add(user);

jak widać nie ustawiając właściwości Id zostanie ona automatycznie nadana przy zapisie do bazy (pod warunkiem, że jest to primary key)

a użytkownik moze dodatkowo zmieniac kolejność, stad ten Lp w tabeli z elementami.

Można tutaj dodać dodatkową właściwość obiektu np. 'PositionIndex' i ją zmieniać wedle chęci użytkownika (warto zadbać, żeby elementy zamieniały się i nie występowała podwójnie taka sama wartość)

0

A to nie powinno być tak rozwiązane, że dane są trzymane w jednej kolekcji, a to jak wyświetlamy dane np.w WPF to oddzielna kolekcja w widoku?

0
[froziu napisał(a)]

Jeśli stworzysz sobie klucz główny np. jako Id, to możesz posortować wyświetlane elementy po Id. Zakładając, że będą dodawane do bazy po kolei, będą automatycznie numerowane.

Ale mi chodzi o to, ze te numery muszą byc dla kazdego uzytkownika(w przedstawionym przykładzie) Jkabym miał tabele UserBooks to dane w kluczu musialy by sie powtarzac bo

UserId BookId Inne kolumny...
1 1
1 2
2 1
1 3
3 1
2 2
2 3
2 4

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.