Pergunta

Eu tenho um databasescheme simples: o usuário, conta. O usuário tem um-para-muitos relação com a conta.

I geraram um modelo de dados entidade ado.net, e eu posso criar usuários e contas, e até mesmo vinculá-los. Na base de dados do account.user_id está corretamente preenchido, por isso, teoricamente, eu deveria ser capaz de acesso User.Account.ToList () em C # através de entidade.

No entanto, quando eu tento acesso User.Account.ToList () recebo zero resultados.

User user = db.User.First(U => U.id == 1);
List<Account> accounts = user.Account.ToList(); ##count = 0...

Quando eu adicione o seguinte código antes do código anterior, de repente, me dá a contagem correta 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...??

O que estou ausente aqui ??

Outras dicas

Sim, isso é um problema comum quando começar a usar o Entity Framework - nem pai nem filho relacionamentos são preguiçosos carregado então você tem que carregá-los explicitamente. Se você estiver indo para compartilhar o contexto do objeto ao redor entre classes / métodos que você pode querer fazer uma verificação para ver se o relacionamento já está carregado:

por exemplo.

    if(!user.Account.IsLoaded)
        user.Account.Load();

Você pode fazer isso mais fácil com um método de extensão simples:

public static class EntityExtensions
{
    public static void EnsureLoaded(this RelatedEnd relatedEnd)
    {
        if (!relatedEnd.IsLoaded)
            relatedEnd.Load();
    }
}

usando isso faz com que a sua chamada carga mais curto novamente:

user.Account.EnsureLoaded();

E, como ele usa um RelatedEnd, que é comum a pai e filho relacionamentos na estrutura de entidade, você pode usar isso para relacionamentos de referência pai também -. Por exemplo

account.UserReference.EnsureLoaded();

Como rwwilden diz, se você está sempre indo para carregar os objetos filho com o pai, neste caso, você pode querer usar um include para fazer a chamada mais eficiente e evitar uma viagem extra ao banco de dados.

Eu acho que meu conhecimento é um pequeno do quadro bit. :)

Você precisa carregar explicitamente as contas relacionadas em primeiro lugar.

user.Account.Load();

Agora, Ele faz exibição corretamente.

scroll top