2015-11-24 1 views
0

Je travaille sur une application web asp.net mvc 4, et j'utilise Entity Framework 5. J'ai la méthode de modèle suivant:SingleOrDefault à l'intérieur de Include provoquera l'erreur suivante: - L'expression Include path doit faire référence à une propriété de navigation définie sur le type

public SDJoin AllFindSDDetails_J(int id) 
{ 
    var IT360Resource = entities.Resources 
       .Include(a => a.ComponentDefinition) 
       .Include(a => a.ResourceLocation.SiteDefinition.SDOrganization) 
       .Include(a => a.ResourceLocation.SiteDefinition.AccountDefinitions1.SingleOrDefault().SDOrganization) 
       .Include(a => a.ResourceState) 
       .SingleOrDefault(a2 => a2.RESOURCEID == tmsSD.Technology.IT360ID); 

mais lorsque cette méthode est appelée, je reçois l'exception suivante:

l'expression de chemin d'inclusion doit se référer à une propriété de navigation définie sur le type. Utilisez les chemins pointillés pour les propriétés de navigation de référence et les propriétés Sélectionner l'opérateur pour la collection de collections . Nom du paramètre: chemin Description: Une exception non gérée s'est produite lors de l'exécution de la requête Web en cours. Veuillez examiner la trace de la pile pour plus d'informations sur l'erreur et d'où elle provient dans le code.

Détails de l'exception: System.ArgumentException: l'expression Include path doit faire référence à une propriété de navigation définie sur le type. Utilisez les chemins en pointillés pour les propriétés de navigation de référence et l'opérateur Select pour les propriétés de navigation de collection.

Je l'ai fixé en remplaçant ceci:

.Include(a => a.ResourceLocation.SiteDefinition.AccountDefinitions1.SingleOrDefault().SDOrganization) 

avec:

.Include(a => a.ResourceLocation.SiteDefinition.AccountDefinitions1.Select(aa=>aa.SDOrganization)) 

Je remplacé SingleOrDefault() par Select(aa=>aa...)

Ma question est: pourquoi je ne peux pas définir SingleOrDefault() à l'intérieur .Include()

Deuxième question: pourquoi je n'ai pas d'erreur de compilation? Je veux dire que j'ai réussi à construire mon projet, mais à l'exécution, j'ai eu l'exception quand la méthode a été appelée.

Merci

+1

Vous n'avez pas reçu d'erreur de compilation car sa syntaxe est valide. Entity framework est une bibliothèque et ne peut pas détecter ce type d'erreur avant l'exécution. Quant à * pourquoi * vous ne pouvez pas simplement charger la première ligne étrangère: C'est une limitation de EntityFramework. Vous pouvez l'éviter en chargeant explicitement la ligne étrangère après votre première requête (et en la supprimant de 'Include'). – Rob

+0

@Rob mais utilise .Sélectionnez comme je fais une approche correcte à suivre? , je veux dire cela provoquera l'aa.SDOrganization être impatient chargé? –

+1

Oui, cela entraînera leur chargement avec empressement (cependant, il chargera * tout * des lignes étrangères, pas seulement la première) – Rob

Répondre

-1

Avez-vous défini un mappage? Je ne vois aucune cartographie ici. Vous devrez peut-être définir spécifiquement les relations d'objet en utilisant le mappage via un mappage fluide ou basé sur des attributs entity mapping

+0

dont vous parlez? –

+0

Jetez un oeil au lien. EF déduira les relations basées sur votre modèle, mais il ne sait pas toujours ce que vous avez l'intention de faire. Vos relations réelles peuvent être différentes de la moyenne, donc ef peut ne pas être en mesure de déduire à partir du modèle. Dans ce cas, il est préférable de créer un mappage et de l'inclure dans le générateur de modèle. Il va définir les propriétés de navigation correctes. –