Come arrivare a chiavi esterne nel modello di entità ADO.NET?
-
03-07-2019 - |
Domanda
Ho 3 tabelle (e entità corrispondenti nel modello entità) Gioco: Id - chiave di inserimento ... altre colonne
giocatore: Id: chiave primaria ... altre colonne
GamePlayer (un giocatore può partecipare a molti giochi) GameId - > chiave esterna dal gioco PlayerId - > chiave esterna dal lettore ... altre colonne
Nel mio codice, ho gameId e playerId disponibili per me attraverso altri mezzi. Usando questo voglio sapere se il giocatore (playerId) partecipa a un gioco particolare (gameId). Quindi sto facendo questo: (entità è il mio oggetto di contesto)
IQueryable query = entity.GamePlayer.where (gp = > ((gp.Game.Id == gameId) & amp; & amp; (gp.Player.Id == playerId))) Se la query restituisce una riga, allora so che il giocatore sta partecipando a quel gioco.
Ho letto più blog MSDN sui riferimenti alle entità e sono confuso. Sembra che MSDN mi consiglia di controllare prima l'oggetto EntityReference per IsLoaded e, se non caricato, devo caricare l'entità e SOLO quindi dovrei usarlo nella query.
GamePlayer ha GamePlayer.GameReference e GamePlayer.PlayerReference, ma non riesco a verificare se il riferimento è caricato perché non ho in mano un oggetto GamePlayer. La tabella GamePlayer contiene le due relazioni 1 ... * e questo è tutto. Devo interrogare GamePlayer solo usando GameId e PlayerId. Cosa sto facendo di sbagliato qui?
Dovrei invece ottenere l'oggetto Giocatore (o Gioco) (usando i loro ID) e controllare invece la raccolta di entità GamePlayer? Sql era così semplice. Se è così ingenuo, mi dispiace, sto facendo fatica a tradurre la mia query sql in query di entità.
Soluzione
Penso che quello che stai facendo vada bene. Per quanto ne so, qualunque cosa tu usi nell'espressione lambda non deve essere caricata esplicitamente.
Penso che a cosa si riferisca MSDN se vuoi ottenere un'entità GamePlayer e accedere a un'entità associata come questa:
GamePlayer gp = entity.GamePlayer.First (g = > g.id = 2);
string gameName = gp.Game.name;
Ciò genererebbe un'eccezione (dovresti caricare il gioco separatamente o assicurarti che sia caricato in questo modo: entity.GamePlayer.Include (" Game "). Primo (g = > g.id = 2 ))