Jak pobrać dodatkowe dane jeśli w bazie nie ma utworzonej relacji?

0

Cześć.
Chciałbym przy użyciu EntityFrameworkCore pobrać dane z bazy. Aplikacja typu database first korzysta z już istniejącej bazy i tabel, a to o co mi chodzi to dociągnięcie danych z innej tabeli na podstawie id.

Podam moze jakiś przykład który opisuje to co chcialbym osiągnać.
Mam tabelę Uczen i Klasa które są w aplikacji zmapowane na klasy:

public class Uczen
{
public string Imie{get;set;}
public string Nazwisko{get;set;}
public int KlasaId{get;set;}
}

public class Klasa
{
public int Id{get;set;}
public string Nazwa{get;set;}
public string Symbol{get;set;}
public int IloscUczniow{get;set;}
}

Zakładamy ze w bazie nie ma utworzonej żadnej relacji między tymi tabelami i ja nie mogę dodać żadnych relacji.

Chciałbym teraz za pomocą EntityFrameworkCore pobrac wszystkie dane z tabeli Uczen i dodatkowo wpleść w to dane z tabeli Klasa, aby uzyskać coś mniej wiecej takiego:

public class Wynik
{
public string Imie{get;set;}
public string Nazwisko{get;set;}
public int KlasaId{get;set;}
public string KlasaNazwa{get;set;}
public string KlasaSymbol{get;set;}
}

Czy da się to jakoś zrobić w jednym zapytaniu, czy musze pobrać wszystko z tabeli Uczen i wszystko z tabeli Klasa i już w aplikacji jakoś złączyc te dwie kolekcje?

2

w obecnym modelu musisz pobrac dane dwukrotnie

Tutaj wiecej o tym jak mozna tworzyc relacje tak by pobrac wszystko w jednym zapytaniu
https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

Na co powinienes zwrocic uwage to na Include
Wynik rzutujesz za pomoca Select(x => new Wynik {/*tu Twoje properties*/});

0

@fasadin: dziękuje.
Czytałem, że aby skorzystać z include to w bazie musi być miedzy tabelami ralacja, czego ja u siebie nie moge zrobić.

1

wiec musisz pobrac dane i pozniej je zlaczyc.

Pobierz sobie dane do Dictionary<int, Uczen> oraz Dictionary<int, Klasa> gdzie kluczem bedzie KlasaId oraz Id
Dzieki takiemu zabiegowi laczenie powinno byc relatywnie szybkie (sprawdzasz czy istnieje klucz w drugiej kolekcji jezeli tak, to mozesz dostac sie do obu obiektow za pomoca tego klucza i pobrac potrzebne dane

a mozna wiedziec czemu nie mozesz stworzyc relacji?

Edit: poniżej rozwiązania są dużo lepsze

6

A nie da się zrobić tego jednym zapytaniem ze zwykłym joinem?
Dawno nie używałem EF w ten sposób, ale według dokumentacji powinno zadziałać.

https://docs.microsoft.com/en-us/ef/core/querying/complex-query-operators#join

5

Możesz sam określić klucze obce atrybutem ForeignKey w modelu lub funkcją OnModelCreating w kontekście. Include będzie działać

0

Czyli wychodzi na to, poprawcie mnie jeśli się mylę, że można mieć relacje po stronie aplikacji nie mając relacji w bazie :)

0

Niektórzy pryncypale symulują bazy nierelacyjne w bazach relacyjnych robiąc schematy bez kluczy obcych, po prostu zwykłe wartości.

0
kalimata napisał(a):

Czyli wychodzi na to, poprawcie mnie jeśli się mylę, że można mieć relacje po stronie aplikacji nie mając relacji w bazie :)

Nie, relacje możesz mieć tylko w bazie. W bazie możesz też mieć związki relacji (jeśli zdefiniujesz klucze obce).
W aplikacji co do zasady możesz robić co chcesz, jeśli tylko język jest kompletny.

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