Je pense qu'il y a un post similaire ici à ce sujet mais pas exactement le même ... P>
J'ai deux entités dans mon modèle EF - appelons-les personne et développeur, avec ce dernier héritage de l'ancien. p>
J'ai aussi une association sur le développeur appelée qualifications. Ce n'est pas visible sur l'entité de la personne. P>
Si j'écris une requête contre le contexte, comment puis-je automatiquement. Include () les qualifications du développeur E.g. P>
de l'employé en contexte.employé
.Include ("qualifications")
Sélectionnez Employé Strong> P>
ne fonctionne pas ... EF se plaint que la relation n'existe pas (je suppose parce qu'elle n'existe pas sur l'employé - mais il n'y a pas d'entité de développement sur le contexte, juste employé). P>
4 Réponses :
Je ne connais pas l'EF, mais cela me considère comme un problème de héritage standard. Si vous souhaitez accéder aux propriétés uniques d'une classe enfant d'une collection d'objets «parent» (où les objets réels peuvent ou non être des instances de la classe enfant), vous devez vérifier le type d'objet et le jeter à l'enfant. Le cas échéant, vous pouvez alors accéder aux propriétés uniques. P>
Qu'attendriez-vous que l'instruction donnée retourne si tout ou partie des objets étaient une personne non développeuse? P>
Salut ... Il ne faut pas essayer de charger les entités d'enfants pour la classe de base, car ils n'existent pas. Je fais la coulée pour vérifier les propriétés de l'enfant, etc. - mais tout le point de l'inclusion consiste à tout lire en une seule fois (gardez à l'esprit que EF ne supporte pas la chargement paresseux).
Je pense que je serais enclin à ne pas sous-classe une personne, mais plutôt à créer une autre classe appelée développeur qui a - une personne, de cette façon, vous pouvez probablement récupérer une collection de personne et par l'intermédiaire de l'association pour pouvoir récupérer ceux qui sont référencés par un développeur et de Cet objet de développeur peut être capable de les trouver de qualifications. I.M Vraiment pas sûr qu'il est possible de faire ce que vous essayez de faire de l'utilisation de la hiérarchie de classe que vous avez indiquée.
Que diriez-vous de cela:
var developers = from anon in developers.AsEnumerable() select anon.Developer;
Bonjour - Merci pour la suggestion. Je vais essayer ça! Cela semble un peu comme celui-ci n'est pas une solution "officiellement prise en charge" de ce lien que vous avez fourni, cependant. Je l'ai arrêté temporairement en appelant la charge sur la collection de l'enfant, mais cela se traduit par un appel SQL séparé, donc je tiens à l'éviter si possible. Merci encore.
Bien que une chose que je viens de réaliser - la méthode que ce code vit peut être en mesure de pouvoir travailler avec des classes dérivées et non dérivées, c'est-à-dire que je devrais récupérer une collection d'employés, dont certains peuvent être des développeurs (qui devraient alors avoir leurs qualifications remplies).
Le bit qui n'est pas officiellement pris en charge sur le lien était le tri de la collection. Le chargement réel de la collection (tout ce qui est utilisé ci-dessus) est entièrement pris en charge.
Je trouve étonnant que cette fonctionnalité de base n'existe pas dans EF. Le problème majeur est que je suis confronté, c'est que si je veux retourner tous les employés mais que je reçois toujours les qualifications chargées pour les développeurs, en faisant: qualifications = (développeur est développeur)? (Developer en tant que développeur) .Qualifications: null) Je suis incapable de créer une valeur constante null du type 'System.Collections.Generic.icollection`1'. Seuls les types d'entité, les types d'énumération ou les types primitifs sont pris en charge dans ce contexte. Quelles sont mes options ?!
Je suis tombé sur ce problème et j'ai expérimenté un peu. Voici ce que j'ai trouvé fonctionné à l'aide de Linq 2 entité.
Disons que nous avons dans votre exemple personne
Si vous souhaitez sélectionner un développeur avec des qualifications incluses, Vous feriez cela. P>
var dev = (from d in context.Persons .Include("Address") .OfType<Developer>() .Include("Qualifications") where d.ID == id select d).FirstOfDefault();
Basé sur la réponse de Tri Q, mais pour ceux qui préfèrent l'approche '.charger ()' ', vous pouvez utiliser: Je l'utilise à l'intérieur de mon dBContext. J'ai créé la méthode LoadDB (), qui charge toutes les données dont j'ai besoin. Donc, je peux l'utiliser de nombreux projets. P> p>