Przypisanie nowego użytkownika do filmu w bazie danych

0

Napisałem aplikację, której działanie wygląda następująco:

  1. Użytkownik zakłada konto i loguje się.
  2. W odpowiednie pole wkleja link do filmu z serwisu Filmweb.
  3. Aplikacja parsuje link i otrzymane wyniki typu: reżyseria, opis, okładka, scenariusz itd. dodaje do bazy danych.
  4. I tak dalej: użytkownik może wkleić link do innego filmu (i jeżeli tytuł ten nie został już wcześniej przez niego dodany), proces parsowania powtórzy się.

To co opisałem wyżej działa, jednak nie tak jak chcę. Załóżmy, że mam użytkowników o nazwach Jarek i Damian. Każdy z nich wkleja do parsera film o tym samym tytule, np. Obecność. Obecnie w bazie danych zrobi mi się coś takiego:
database1
a ja chciałbym, żeby zrobiło mi coś takiego:
database2
bo nie ma sensu powtarzać wszystkich danych dotyczących filmu, skoro są takie same, wystarczy dodać nowego użytkownika do pola UserName przypisanego do konkretnego filmu. Pytanie tylko jak to zrobić?

Cały kod mojej aplikacji dostępny jest tutaj FilmwebParser - Bitbucket. Pierwsze, co mi przyszło do głowy to była zamiana w pliku Models / Film.cs z

public string UserName { get; set; }

na

public List<string> UserName { get; set; }

ale z tego co wyczytałem nie da się zmapować listy stringów do bazy. Ma ktoś pomysł, jak się za to zabrać?

0

Nie mapuj listy stringow tylko zrob wiazanie wiele-do-wiele miedzy filmem a uzytkownikiem.
https://docs.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many

0

Hmm...
Zgodnie z przykładem, utworzyłem klasę UserFilm a w niej właściwości:

public int FilmID { get; set; }
public Film Film { get; set; }
public int UserID { get; set; }
public FilmUser FilmUser { get; set; }

Do klasy FilmUser dodałem linijkę:

public List<UserFilm> UserFilms { get; set; }

a w klasie Film zamieniłem linijkę:

public string UserName { get; set; }

na:

public List<UserFilm> UserFilms { get; set; }

O to chodziło? Jeżeli tak, to jak teraz odwoływać się do "byłego" pola UserName, które było stringiem?

0

Byłego już nie ma.

1

To rozwiązanie to nic innego jak trzecia tabela z dwoma kluczami obcymi (jeden to film, drugi to użytkownik). Jeśli chcesz znaleźć userów, którzy dodali film to możesz i) przeszukać tę tabelę (UserFilm) po FilmId i włączyć (Include) do wyników właściwość FilmUser; ii) przeszukać tabelę Films po Id i włączyć do wyników właściwość UserFilms, która jest listą encji tabeli UserFilms.
I polecam pomyśleć nad nazwami klas - nazwy FilmUser i UserFilm zdecydowanie mogą się pomieszać.

1

@DamianOS.MP5: dodatkowa klasa jest niepotrzebna.
Wystarczy List<Film> w klasie user i List<User> w klasie film.
Nie wiem jak obslugujesz db i zmiany w db. Jeśli to Code First to wystarczy tylko wzajemna definicja kolekcji.

0

@jacek.placek: racja, dodatkowa klasa niepotrzebna. Mój błąd.

0

Już sobie poradziłem z tym.

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