Entity Framework Code First tworzenie klas i relacji jeden do wielu.

Odpowiedz Nowy wątek
2019-02-17 23:16
0

Witam.

Tworzę aplikację i za przykład do testowania biorę sobie tabelę zamówień. Mam 2 pytania odnośnie modelowania klas.

Mam 3 klasy :


public class Car
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }

public class Part
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }

   class Order
    {
        public Order()
        {
            Cars = new List<Car>();
            Parts = new List<Part>();
        }

        public int OrderId { get; set; }

        public int CarId { get; set; }
        public int PartId { get; set; }

        public ICollection<Car> Cars { get; set; }
        public ICollection<Part> Parts { get; set; }
    }

Nie wiem czy taki model jest ok. Co myślicie ? Bo cos mi sie tu nie spina :/ W aplikacji :

  • Nie mogę do zamówienia dodawać samochodów i części których nie mam w bazie.

  • W tabeli zamówień chciałbym tylko widzieć Id zamówienia, wartość zamówienia oraz Id samochodu i Id czesci która była kakupiona.

Chcialbym aby tabele Car i Part nie mialy danych o zamowieniach. Chcialbym w aplikacji tylko dodawac czesci albo samochody, pozniej tylko moc z nich wybierac w sekcji zamowienia.

Pozostało 580 znaków

2019-02-18 12:48
0

A nie wystarczy w order napisać tak?

        public List<Car> Cars{get;set;}
        public List<Part> Parts{get;set;}

        public Order()
        {
        }

bez tych Icolletionów?

Podczas tworzenia obiektu Orders, konstruktor domyślnie stworzy te listy, tak mnie się wydaje, ale niech mądrzejsi się wypowiedzą ;-]

ewentualnie spóbuj jescze tak

public ICollection<Car> Cars{ get; set; } = new List<Car>();

też poza konstruktorem

edytowany 2x, ostatnio: maxus_pl, 2019-02-18 12:57
Jaki to ma związek z jego problemem ? - szydlak 2019-02-18 13:22

Pozostało 580 znaków

2019-02-18 13:07
3

Masz źle zrobioną relację. Po co w Order CarId jak on ma listę Car ?. Jak dla mnie to powinna być many to many. Czyli wiele zamówień ma wiele części, co wymaga dodatkowej tabeli np OrderItem

edytowany 2x, ostatnio: szydlak, 2019-02-18 13:14

Pozostało 580 znaków

2019-02-18 13:25
0

Zrobiłem teraz coś takiego tworząc tabele pośrednie :


public class Car
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }

    public virtual ICollection<Order> Orders { get; set; }
}
public class Part
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }

    public virtual ICollection<Order> Orders { get; set; }
}

class Order
{
    public Order()
    {
        Cars = new List<Car>();
        Parts = new List<Part>();
    }

    public int OrderId { get; set; }

    public virtual ICollection<Car> Cars { get; set; }
    public virtual ICollection<Part> Parts { get; set; }
}
Dalej nie jestem pewny co się wygeneruje i czy będzie dobrze działać. Ze względu na dwie tabele Car i Part. Jak masz jedną np Product i tylko OrderItems z id productu byłby łatwiej - szydlak 2019-02-18 13:49
@szydlak: poprzez taki zapis generują mi się 2 dodatkowe tabele pośrednie czyli CarOrder i PartOrder - BLAZO 2019-02-18 13:57
Ponieważ masz relacje many to many. Wiele zamówień może mieć wiele części, jedna część może być w wielu zamówieniach. - Aventus 2019-02-18 14:02
Spróbuj sobie odpowiedzieć na pytanie- jak chciałbyś w jednym rekordzie Order zapisać wiele referencji do Part, pozwalając przy tym aby dany rekord Part mógł należeć do wielu Order? - Aventus 2019-02-18 14:03

Pozostało 580 znaków

2019-02-18 14:21
0

@Aventus wiem że się tak nie da. Dlatego klasy są tak skonstruowane i generują pośrednie tabele. Dalej w sumie nie jestem pewnien czy to aby na pewno dobre rozwiązanie. Potrzebne mi na pewno relacje many to many. Chciałbym również zapoznać się jak tworzyć takie zamówienie że chcę sworzyć zamówienie i że w skład zamówienia będzie wchodził Car z ID = 1 , Car z Id = 2 i np 2 części z PartId = 1

Pozostało 580 znaków

2019-02-18 14:24
0

Może musisz wejść np w dziedziczenie. Car i Part dziedziczą po Product a orderitem zawiera Product.
Coś jak tutaj: https://entityframework.net/tpt

Pozostało 580 znaków

2019-02-18 14:40
0
Potrzebne mi na pewno relacje many to many.

powiedz co chcesz osiagnac. Podaj biznesowy use case

Pozostało 580 znaków

2019-02-18 14:49
0

Mam aplikację to tworzenia zamówień. Model z samochodami i częściami jest tylko testowy.
Aplikacja to Burgerowania.

  • Tablica ze składnikami (Id,Name)
  • Tablica z sosami(Id,Name,Price)
  • Tablica z Burgerami ( Id, Name , Lista składników( dostępnych w tablicy składnik) oraz jeden sos pod bułkę :D ( dostępnych z tablicy sosy)
  • Tablica z Zamówieniami ( IdZam) oraz elementy zamówienia czyli listy burgerów i listy sosów bo do zamowienia można dokupić sosy(ile sie chce).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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