Ado.Net Entidade: objeto não exibir membros vinculados (chaves estrangeiras)
-
09-09-2019 - |
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 ??
Solução
Você deve usar o href="http://msdn.microsoft.com/en-us/library/bb738708.aspx" rel="nofollow noreferrer"> método para isso. Seu método funciona também, mas resulta em uma consulta adicional.
No seu exemplo você iria ficar
User user = db.User.Include("Account").First(u => u.id == 1);
Você tem que descobrir se o "Account"
string é correta. Normalmente ele deve ser prefixado com algo como MyEntities
. Isso depende do espaço de nomes de suas entidades, mas com um pouco de tentativa e erro você deve ser capaz de descobrir isso.
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.