Jak działa <List> w Entity Framwork w bazie danych

0

Cześć, spróbowałem zaprojektować baze danych jak najbardziej czytelnie ale nie moge rozkminić jednej rzeczy, choć widziałem w tutorialach, że tak ludzię robią ale nie znalazłem rozwiązania mojego problemu. Powiedzmy, że mamy przedmiot Item, ma on określone tam w sobie parametry, a w klasie Player jest Lista Item'ów. Wiele FK w jeden liście.
I jak to jest zachowywane w bazie danych, bo albo coś źle zrobiłem bo taka** kolumna nie istnieje** jak Items (przykład uproszczony i kontekst zmieniony, żeby wyjaśnić o co mi chodzi)

public class Player {
[...]
       public List<Item> Items { get; set; }
[...]
}

I jak działają Listy w bazie danych? Mam jeszcze jeden przykład, choć troche inny bo tutaj z tego co widzę jest nawiązanie, którego ja bym nie robił (Ciastko, może mieć jedną kategrią, ale kategoria ma wiele ciastek [nie wiem po co tu ta lista]) w każdym razie jak to działa bo mi w bazie danych nie pokazuje a ten fragment gdzieś znalazłem.

public class Pie
    {
        public int PieId { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string ImageUrl { get; set; }
        public string ImageThumbnailUrl { get; set; }
        public bool IsPieOfTheWeek { get; set; }
        public bool InStock { get; set; }
        public int CategoryId { get; set; } 
        public Category Category { get; set; }
    }
public class Category
    {
        public int CategoryId { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }
        public List<Pie> Pies { get; set; } 
    }
2
public class Player 
{
	Id;
	public List<Item> Items { get; set; }
}

Jest równe takiemu schematowi

Players Table:

| Id |
| ------------- |:
| 1 |
| 2 |


Items Table:

| Id | PlayerId (FK) |
| ------------- |: ---------- |:
| 1 | 1
| 2 | 1
| 3 | 1
| 4 | 2

0

Hmm to nie wiem jak to zorganizować, generalnie schemat bazy jaki potrzebowałem do tego co robi już mam przygotowany na tyle ile potrafiłem, ale nie zorientowałem się jak progresywanie (ciągle można coś nowego przypisywać) przetrzymać (W dobry sposób!) w moim przykładzie, dodawanie Item do Players (w kolumnie) z tym, że Item może być przypisany do wielu Players. Generalnie, móglbym zrobić tabele, przykładowo Equipment, potem FK Player i FK Item i potem zrobić taki Widok Tej Listy i bym wtedy widział wszystkie przypisane Item(s) do danego Playera.

W czym Ja bym widział problem? No że w jednej tabeli bym miał mix przypisanych Itemów do Playerów (różni Playerzy różne przedmioty), było by to nie czytelne (choc być może tylko dla mnie, ja bym chciał stricte mieć tą liste Item'ów zbinowaną do Playera, inaczej mojej myśli nie umiem objaśnić), choć nie wiem jak bazy dany wyglądają w praktyce.
Serdecznie pozdrawiam.

2

Cały problem polega na tym, że lista w EF działa na zasadzie zapytania do bazy "znajdź wszystkie gdzie... i umieść je w liście". Działa to mniej więcej tak:
screenshot-20201120225714.png

Na przykładzie jak ja się uczę mam klasę ApplicationUser i mogę pobrać listę wszystkich rezerwacji należących do niego:

[Table("ApplicationUsers")]
    public class ApplicationUser : IdentityUser
    {
        [PersonalData]
        [Column(TypeName ="nvarchar(100)")]
        public string FirstName { get; set; }
        
        [PersonalData]
        [Column(TypeName = "nvarchar(100)")]
        public string LastName { get; set; }

        [IgnoreDataMember]
        public string FullName { get { return FirstName + " " + LastName; } }
        [IgnoreDataMember]
        public string FullNameWithEmail { get { return FirstName + " " + LastName + " (" + Email + ")"; } }
        [IgnoreDataMember]
        public string LastAndFirstName { get { return LastName + " " + FirstName; } }

        public virtual ICollection<RoomReservation> RoomReservations { get; set; }
        public virtual ICollection<Voucher> Vouchers { get; set; }

    }

screenshot-20201120230944.png

Dzięki temu możesz wyszukać wszystkie rezerwacje użytkownika (w Twoim przypadku Itemy)

var UserReservations = await _dbContext.Users.Where(x => x.Id == id).Include(x => x.RoomReservations).Select(x => x.RoomReservations).ToListAsync();

Edit:
Zapomniałem napisać, że ja też się tego dopiero uczę, więc jeżeli coś napisałem źle proszę mnie poprawić :)

1

@Mati Marecki:

W czym Ja bym widział problem? No że w jednej tabeli bym miał mix przypisanych Itemów do Playerów (różni Playerzy różne przedmioty), było by to nie czytelne (choc być może tylko dla mnie, ja bym chciał stricte mieć tą liste Item'ów zbinowaną do Playera, inaczej mojej myśli nie umiem objaśnić),
Serdecznie pozdrawiam.

No to tak właśnie ma działać. Mając w encji Player liste itemów EF mapuje to na relacje 1:n. (przy odpowiednim skonfigurowaniu)
Czyli jeden player wiele itemów.

Pobierając sobie Playera pobierzesz (include) tylko jego itemy. A na bazie masz dwie tabele. Players oraz items. Items zawiera Itemy wszystkich Playerów. Tak działa relacja jeden do wielu.

choć nie wiem jak bazy dany wyglądają w praktyce.

No właśnie. Raczej od tego powinieneś zacząć.

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