0

Si j'ai une table avec une clé primaire (AccLinkID) et une clé étrangère (aspnet_Users UserID), comment puis-je sélectionner l'objet pointé par la clé étrangère en utilisant Linq to Entities.Comment sélectionner un objet à l'aide d'une clé étrangère

User myUser = _myDB.AccLinkSet.Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users; 

ne fonctionne pas ...

quelqu'un a des idées?

Répondre

1

Essayez ceci:

User myUser = _myDB.AccLinkSet.Include("aspnet_Users") 
    .Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users; 
+1

+1 - Oui, Entity Framework ne charge pas automatiquement les ensembles d'objets référencés - vous devez soit les charger explicitement avec .Load(), soit les inclure dans le résultat de la requête avec cette méthode .Include. –

+1

Le code ci-dessus ne fonctionnera pas. Include renvoie une nouvelle ObjectQuery, que vous ignorez (permettant de la collecter) et utilisez la ObjectQuery non incluse. Inclure et Où doit être sur * la même ligne *. –

+0

@Craig Stunz - merci, mis à jour la réponse –

0

Pour l'instant, avec Entity Framework 1, vous ne recevez pas le chargement automatique retardé, par exemple Si vous souhaitez traverser d'une entité à la suivante, vous devez soit faire un .Include("OtherEntity") sur votre sélection pour inclure ces entités dans la requête, ou vous devez appeler explicitement .Load("OtherEntity") sur votre EntityContext pour charger cette entité.

Il s'agissait d'une décision de conception de l'équipe EF de ne pas prendre en charge le chargement différé automagique, car ils la jugeaient trop dangereuse; ils voulaient que l'utilisateur comprenne clairement qu'il comprenne/charge un second ensemble d'entités.

En raison de la forte demande populaire, le prochain EF v4 (qui sortira avec .NET 4.0 vers la fin de 2009) prendra en charge le chargement différé automatique - si vous souhaitez l'utiliser. Vous devez activer explicitement car il est désactivé par défaut:

context.ContextOptions.DeferredLoadingEnabled = true; 

Voir quelques articles sur cette nouvelle fonctionnalité:

1

Bien que vous pouvez résoudre Avec Include, comme d'autres l'ont suggéré, ce n'est pas comme ça que je le ferais. Au lieu de cela, je projette, qui ne nécessite jamais Inclure:

var q = from al in yDB.AccLinkSet 
     where al.LinkID == linkId 
     select al.aspnet_Users; 

Dans ce cas, les utilisateurs sont chargés automatiquement.

Questions connexes