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??

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.

scroll top