Question

Pour une partie du projet sur lequel je travaille actuellement, j'ai un ensemble de quatre tables pour les actions syndicables. Une table est la base abstraite des trois autres, et chaque table est représentée dans mon modèle EF comme suit:

Modèle EF - Actions http: // chris. charabaruk.com/system/files/images/EF+Model+Actions.png

Cependant, je suis actuellement confronté à deux problèmes. Le premier problème est que Actor (une référence à un Utilisateur ) et Sujet (une référence à une entité de la classe associée à chaque type de action) sont null dans mes sous-classes, malgré les colonnes de base de données associées contenant des clés valides pour des lignes dans leurs tables associées. Bien que je puisse obtenir les clés via ActorReference et SubjectReference , cela nécessite bien sûr de définir un nouveau contexte EF et de le rechercher pour les objets référencés (sous la forme Foo Reference.Value est également null).

Le deuxième problème est que la fin réciproque de la relation entre les classes d’action concrètes et les classes d’entité associées ne produit toujours rien. Par exemple, Task.RelatedActions , qui devrait me fournir tous les objets TaskAction Subject fait référence à l'objet de tâche particulier sur lequel RelatedActions s’appelle, est entièrement dépourvu d’objets. Là encore, il existe des lignes valides dans la base de données. Entity Framework ne les met pas dans des objets et ne me les remet pas.

Quelqu'un sait ce que je fais de mal et ce que je devrais faire pour que cela fonctionne?

Mise à jour: Il semble qu'aucune des propriétés de relation ne fonctionne plus dans mon modèle d'entité. WTF ...

Était-ce utile?

La solution

Je pense que le problème que vous rencontrez ici est que, par défaut, l'EF ne charge pas automatiquement les entités associées. Si vous chargez une entité, la collection ou la référence aux entités associées sera vide à moins que vous ne procédiez comme suit:

1) Utilisez le chargement rapide pour extraire votre entité principale et votre entité associée en une seule requête. Pour ce faire, modifiez votre requête en ajoutant un appel à la méthode Include. Dans l'exemple ci-dessus, vous pouvez utiliser la requête suivante:

from a in context.Actions.Include("Actor") select a

Ceci récupérerait chacune des actions avec la méthode Actor associée.

2) Utilisez le chargement paresseux explicite pour récupérer l'entité associée lorsque vous en avez besoin:

action1.ActorReference.Load()

Dans la version de l'EF livrée avec .Net 4.0, vous aurez également l'option supplémentaire suivante:

3) Activez le chargement différé implicite pour que les entités associées soient automatiquement récupérées lorsque vous référencez la propriété de navigation.

  • Danny
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top