2010-01-22 3 views
4

Je suis nouveau dans Entity Framework et LINQ et j'ai été confronté à un scénario plutôt étrange.Entity Framework: LINQ Include() ne fonctionne pas après la mise à jour de la base de données, pourquoi?

J'utilise la requête suivante pour renvoyer des informations de compte:

var account = ((from acct in _entities.Account 
         join m in _entities.Item on acct.Id equals m.Account.Id 
         where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber) 
         select acct) as ObjectQuery<Account>).Include("Item.ItemDetails"); 

Nous avons récemment apporté quelques modifications à la base de données et a généré un nouveau fichier edmx. Après la modification, la requête ci-dessus renvoie toujours le compte et l'élément associé, mais ItemDetails n'est plus inclus.

J'ai validé le SQL renvoyé par la requête et il ne semble pas y avoir de problème lorsque les données correctes sont renvoyées.

En outre, je ne vois rien de différent dans le fichier edmx entre les objets Item et ItemDetails car ceux-ci n'ont pas été modifiés et la propriété de navigation est là.

Quelqu'un at-il déjà vu cela?

Merci

Répondre

1

En Include (...) est utilisé le nom de la propriété de navigation de sorte qu'il sera bon de vérifier le nom exact de la propriété du .edmx (surtout si elle est singulier ou au pluriel) .

vous pouvez également essayer de changer la requête comme ceci:

var account = from acct in _entities.Account.Include("Item.ItemDetails") 
       join m in _entities.Item 
        on acct.Id equals m.Account.Id 
       where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber) 
       select acct; 
+0

Autre que la lisibilité, quel avantage que votre requête a plus de l'affiche? – mlsteeves

+0

Je pense que cette façon a le même résultat: de acct dans _entities.Account.Include ("Item"). Inclure ("Item.ItemDetails") où acct.Id == accountId && m.ItemNumber.EndsWith (itemNumber sélectionnez acct; –

+0

Je voudrais tester ceci .... rappelez-vous qu'il y a un comportement bizarre avec Include et Join:) – SDReyes

1

Vous avez l'un des deux scénarios possibles:

  1. Item a une relation Account (exprimée dans votre modèle entité EntityAssociation et DB en tant que clé étrangère):

  2. Il n'y a pas de relation entre Item d Account set, par conséquent, vous devez spécifier une jointure dans LINQ comme vous l'avez fait.

Cas 1: si tel est le cas, alors vous n'avez pas besoin d'une instruction de jointure ... en sélectionnant Acount.Item vous donnera naturellement tous les éléments où Item.AccountID est égal à Account.ID

Ainsi, votre jointure déclaration: join m in _entities.Item on acct.Id equals m.Account.Id a fondamentalement dit Item de reboucler sur Account pour vérifier l'ID. Si elles ne sont pas déjà connectés, alors vous ne pourriez pas avoir obtenu m.Account.ID

Cas n ° 2: S'il n'y a pas de relation entre Account et Item, le .Include() ne fonctionnera certainement pas parce que la propriété de navigation n'existe pas dans votre modèle. Conclusion: Vérifiez votre nouveau modèle pour voir s'il existe une relation entre Account et Item. Si oui, supprimez la jointure. Si aucune relation, alors vous avez fait quelque chose de mal.

Voici une instruction select scénario supposant 1 et que Account.Item n'est pas une collection:

var account = from acct in _entities.Account.Include("Item.ItemDetails") 
       where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber) 
       select acct; 
Questions connexes