Ado.Net Entità :L'oggetto non visualizzare i membri collegati (chiavi esterne)
-
09-09-2019 - |
Domanda
Ho un semplice databasescheme:Utente, Account.Utente 1-a-molti rapporti con l'Account.
Ho generato un ado.net entity data model, e sono in grado di creare gli utenti e gli account, e anche li legano insieme.Nel database il conto.id_utente è correttamente compilato, quindi, in teoria, dovrei essere in grado di accesso Utente.Account.ToList() in C#, attraverso entità.
Tuttavia, Quando cerco di accesso Utente.Account.ToList() ottengo zero risultati.
User user = db.User.First(U => U.id == 1);
List<Account> accounts = user.Account.ToList(); ##count = 0...
Quando ho aggiunto il seguente codice prima del codice precedente, improvvisamente, mi dà un corretto conteggio di 2.
Account account1 = db.Account.First(A => A.id == 1);
Account account2 = db.Account.First(A => A.id == 2);
User user = db.User.First(U => U.id == 1);
List<Account> accounts = user.Account.ToList(); ##count = 2...??
Quello che mi manca qui??
Soluzione
Si dovrebbe usare la href="http://msdn.microsoft.com/en-us/library/bb738708.aspx" rel="nofollow noreferrer"> ObjectQuery.Include metodo
Nel tuo esempio si otterrebbe Si deve capire se il User user = db.User.Include("Account").First(u => u.id == 1);
"Account"
stringa è corretta. Di solito dovrebbe essere preceduto con qualcosa come MyEntities
. Questo dipende lo spazio dei nomi delle vostre entità, ma con un po 'di tentativi ed errori si dovrebbe essere in grado di capire questo.
Altri suggerimenti
Sì, è un problema comune quando si inizia a utilizzare Entity framework - né padre né figlio i rapporti sono caricati in modo pigro, quindi devi caricare in modo esplicito.Se avete intenzione di condividere il contesto dell'oggetto in giro tra le classi e i metodi che si potrebbe desiderare di fare un controllo per vedere se il rapporto è già caricato:
ad es.
if(!user.Account.IsLoaded)
user.Account.Load();
È possibile rendere questo più facile con un semplice metodo di estensione:
public static class EntityExtensions
{
public static void EnsureLoaded(this RelatedEnd relatedEnd)
{
if (!relatedEnd.IsLoaded)
relatedEnd.Load();
}
}
utilizzando questo rende il vostro carico di chiamata più breve di nuovo:
user.Account.EnsureLoaded();
E come si utilizza un RelatedEnd, che è comune a padre e figlio i rapporti in entity framework, è possibile utilizzare questo per il genitore di riferimento relazioni - ad es.
account.UserReference.EnsureLoaded();
Come rwwilden dice, se si sta andando sempre di caricare gli oggetti figlio con il genitore in questo caso, si potrebbe desiderare di utilizzare un Include per effettuare la chiamata più efficiente e di evitare un ulteriore andata e ritorno per il database.
Credo che la mia conoscenza è un po 'piccolo del quadro. :)
È necessario caricare in modo esplicito i conti relativi prima.
user.Account.Load();
Ora Non viene visualizzata correttamente.