C# WPF EF 6.1 join művelet hiba

C# WPF EF 6.1 join művelet hiba
2014-09-11T09:56:56+02:00
2014-09-17T08:37:44+02:00
2022-12-01T14:35:38+01:00
Tomi026
Sziasztok. Problémám a következő. Van egy C# WPF applikációm. Létrehoztam benne 2 táblát EF 6.1-et használva. A két táblának meg van adva az asszociációja és az idegen kulcsa is. Eddig tökéletesen futott a program. Ezt követően egy join-t tartalmazó függvénnyel össze akartam kötni a két táblát és egy DataGrid-be kilistázni,hogy lássam valóban működik. De amikor listaként adom meg neki a visszatérési értéket,akkor a program kivételt dob. Íme a kód:

DBManager.cs:
public List<DGValami> Összevont() { var query = from a in adatbazis.Valamis join h in adatbazis.Logins on a.ValaminekAValamije equals h.ID select new DGValami() { id1=a.ID , id2=h.ID, desc=h.Desc, valaminekavalamije=a.ValaminekAValamije }; return query.ToList(); }
A 2 táblám : Valami és Login.
Valami változói: ID,ValaminekAValamije
Login változói: ID,Desc
Én úgy gondolom helyesen adtam meg mindent a függvényben,de valami még sem jó. Az asszociáció esetében a Login ID mezője a Principal Key,a Valami ValaminekAValamije mezője pedig a Foreign Key. Típusra,not null paraméterre,mindenre ügyeltem.

DGValami osztály:

class DGValami
 {
 public string id1 { get; set; }
 public string id2 { get; set; }
 public string desc { get; set; }
 public string valaminekavalamije { get; set; }
 }
MainWindow.cs:

private void dgValami_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { dgValami.ItemsSource = dbmanager.Összevont(); }
Ha a programom futtatni akarom a return query.ToList(); unhandled Exception-t dob és nem értem miért. Régebben láttam már ilyen típusú programot és csinálgattam is anno és ott működött így. Kérlek Titeket,ha tudtok segítsetek,elakadtam és nem tudok tovább jutni amég ez nincs meg,a következő feladatom összekapcsolt táblához kötődne :)
Mutasd a teljes hozzászólást!
Helló!

Kezd az MSDN-en ingyenesen elérhető e-bookokkal.

Pl.: Getting Started with Entity Framework 6 Code First using MVC 5, de van ott 2 régebbi is.
Mutasd a teljes hozzászólást!

  • Helló!

    Kezdjük ott, hogy EF esetén elég speciális esetekben van szükség explicit join-ra.

    A join-okat az EF Navigation Property-k segítségével automatikusan biztosítja.

    Ezek használata valahogy így néz ki a te adatbázisod esetén:

    var query = from a in adatbazis.Valamis select new DGValami() { id1 = a.ID, id2 = a.ValaminekAValamije.ID, desc = a.ValaminekAValamije.Desc, valaminekavalamije = a.ValaminekAValamije };
    Erre át kell állni az agynak, mert kicsit másképp működik, mint a nyers SQL query készítése.

    Próbáld meg így, aztán ha nem megy, légy szíves, ne csak annyit ír, hogy exception-t dob, hanem hogy pontosan mi a hiba!

    Még egy gondolat: célszerű ViewModel-t visszaadni, tehát itt

    valaminekavalamije = a.ValaminekAValamije
    nem tiszta, hogy pontosan minek a mije, de a lényeg, hogy a ViewModel-ed ne függjön az EF osztályaitól, oda már elemi típusokat kérdezz bele, ne EF osztályokat!
    Mutasd a teljes hozzászólást!
  • Szia Kukipapa. Köszönöm,hogy válaszoltál. Az általad mutatott módon csináltam,de az
     id2 = a.ValaminekAValamije.ID,
     desc = a.ValaminekAValamije.Desc,
    nem tetszik neki. 
    A hibaüzenetem:
    String does not contain definition for 'Desc'/'ID' and no extension method stbstb.

    Ezzel a módszerrel egyszerűen nem érem el a Login tábla mezőit. Amit írtál az explicit join-ról azt értem,csak azt nem értem,hogy így hogyan érhetek el 2 táblát úgy,hogy csak az egyikre hivatkozom akkor is, ha ezek össze vannak kapcsolva. Bocsi,eléggé kezdő vagyok :) Köszönöm szépen,hogy szánsz időt a problémámra!
    Mutasd a teljes hozzászólást!
  • Helló!

    Sajnos arra itt nincs lehetőség, hogy olyan témákat, amelyekről könyveket írnak, összefoglaljam egy postban.

    Írod, hogy nem éred el a másik tábla mezőit. Ennek elég sok oka lehet, legelőször pl. azt kéne tisztázni, hogy egyáltalán milyen módon használod az EF-et (code first, database first stb.).

    Mivel az SQL-t ismered, javaslom, hogy mindenképp a database first módszerrel kezdd, ez legenerálja a context-edet a létező adatbázisodból, a foreign key-k alapján létrehozza helyesen a Navigation Property-ket, és utána a fenti példa is működhet.

    Itt egy tutorial erről, persze az egész site-ot érdemes végigolvasni.
    Mutasd a teljes hozzászólást!
  • Akkor lehet az én módszeremmel lenne a baj? DBFirst-el csináltam,viszont én úgy szoktam,hogy csinálok egy service based database-t VS-ben az adott projekten belül. A mezőneveket és típusokat kitöltöm és ebből generálom le a modellem..... Régebben nézegettem sok  EF tutorialt,ott úgy csinálták,hogy megcsinálták az üres modellt,hozzáadták az entitásokat és a kapcsolatokat és aztán generálták le a modell alapján az adatbázist. Ezzel a módszerrel amivel én csináltam eddig nem volt gondom,csak a tábla összekapcsolásnál jelentkeztek ezek a dolgok....
    Mutasd a teljes hozzászólást!
  • Nyilván valamit rosszul csinálsz.

    Továbbra is javaslom, hogy nézd meg, hogy működik, amikor mindent az EF generál (úgy biztosan jó), de pl. itt van egy Navigation Property tutorial code first esetre.

    Nézd meg, hogy ez rendben megy-e nálad, és ha igen, mit csinálsz másképp!

    Ezen kívül az előző tutorial oldal is tartalmaz code first részt.
    Mutasd a teljes hozzászólást!
  • Hihetetlen. Most nem service based database segítségével csináltam,hanem SQL lokális szervert hoztam létre és egy példa alapján query segítségével töltöttem fel a táblákat és a kapcsolatokat. Majd megírtam UGYAN AZT A FÜGGVÉNYEM ami ide ki van írva és működik....Pedig mindent ugyan úgy csináltam,csak a lokális adatbázist nem úgy hoztam létre....
    Mutasd a teljes hozzászólást!
  • Sajnos nem lehet megúszni a tanulási görbét. Én csak utat tudok mutatni, illetve ha valami minden próbálkozás ellenére sem akar működni, akkor tudok segíteni, de végig kéne csinálni a tutorialokat és végig kéne olvasni a könyveket, hogy megtanuld.

    Van egy login táblám. Van benne egy ID(int),egy User és egy Pass (mindkettő varchar). (...) az ID-t valamiért nem tudom sehogy kiolvasni az adatbázisomból

    Amennyiben a context-ed neve dbContext, a kívánt felhasználó ID pedig a selectedUserId, például így:

    int selectedUserId = 4; return from l in dbContext.Logins where l.UserId == selectedUserId select l.UserId;
    Ennek persze nem sok értelme van, hiszen visszakapod a 4-est, azaz azt, amire szűkítettél, de példának jó.
    Mutasd a teljes hozzászólást!
  • Tudsz esetleg tapasztalat alapján konkrét EF könyvet ajánlani? Megvenném és kiolvasnám. Láttam neten párat,de így első körben nem tudom melyik milyen hasznosnak bizonyul. C#,LINQ témában kéne EF esetében (bár h jól tudom alapból ebben alkalmazzák eredetileg,azért jegyeztem csak meg,mert MVC-t is láttam neten EF-el többek között és nem akarok feleslegesen pénzt kidobni) :)
    Mutasd a teljes hozzászólást!
  • Helló!

    Kezd az MSDN-en ingyenesen elérhető e-bookokkal.

    Pl.: Getting Started with Entity Framework 6 Code First using MVC 5, de van ott 2 régebbi is.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd