Entity Framework 4 Tableau par hiérarchie – Comment définir des propriétés de navigation sur des enfants?

J’ai actuellement un modèle Entity Framework 4.0 en place avec table par type (TPT), mais il y a quelques problèmes de performances (beaucoup d’instructions LOJ / CASE), ainsi qu’un mappage de problèmes entre deux domaines particuliers (plusieurs domaines). beaucoup).

J’ai décidé d’essayer TPH.

J’ai une entité appelée ” Localisation ” qui est abstraite et la base pour toutes les autres entités.

J’ai ensuite ” Pays “, ” Ville “, ” Etat “, ” Rue “, etc., qui proviennent tous de Lieu.

LocationType ” est le réducteur .

Cette partie fonctionne bien, mais je ne parviens pas à définir les propriétés de navigation des types dérivés.

Par exemple, un ” État ” a un seul ” pays “, je devrais donc pouvoir le faire:

var state = _ctx.Locations.OfType().Include("Country").First(); var countryForState = state.Country; 

Mais cela nécessiterait une propriété de navigation appelée “Pays” sur l’entité dérivée “Etat”. Comment puis-je faire cela? Lorsque je génère le modèle à partir de la firebase database, j’ai une seule table avec tous les FK pointant vers des enregistrements dans la même table:

texte alternatif

(NOTE: j’ai créé ces FK manuellement dans la firebase database).

Mais les FK sont placés en tant que nav sur l’entité ” Location “, alors comment puis-je déplacer ces propriétés de navigation vers les entités dérivées? Je ne peux pas copier + coller les navs à travers, et je ne peux pas “créer une nouvelle propriété de navigation”, car cela ne me permet pas de définir le rôle de début / fin.

Comment faisons-nous cela?

Il n’est pas clair non plus avec TPH si nous pouvons le faire tout d’abord sur un modèle ou si nous devons commencer par une firebase database, réparer le modèle puis générer de nouveau la firebase database. Je n’ai pas encore trouvé de bon exemple sur Internet pour définir le rôle des navs chez les enfants atteints d’hypertension artérielle pulmonaire.

Remarque: je ne veux pas faire du code en premier . Ma solution actuelle utilise le TPT avec EDMX et les POCO purs. J’espère ne pas affecter le modèle de domaine / les référentiels (si possible) et simplement mettre à jour le modèle / la firebase database EF.

MODIFIER

Toujours pas de solution – même si j’essaie de faire un modèle en premier, et de faire Add -> New Association, ce qui me permet en fait d’append un fichier de navigation aux entités dérivées. Mais lorsque j’essaie de “Générer une firebase database à partir d’un modèle”, il essaie toujours de créer des tables pour “Location_Street”, “Location_Country”, etc. C’est presque comme si TPH ne pouvait pas être modélisé en premier.

MODIFIER

Voici mon modèle actuel:

texte alternatif

L’erreur de validation que je reçois actuellement:

Erreur 1 Erreur 3002: Problème lors du mappage de fragments commençant à la ligne 359: Violation d’exécution potentielle de la clé Les emplacements de la table (Emplacements.LocationId): Les colonnes (Emplacements.LocationId) sont mappées vers les propriétés de EntitySet NeighbourhoodZipCode (NeighbourhoodZipCode.Neighbourhood.LocationId) mais ils ne forment pas les propriétés de clé d’EntitySet (NeighbourhoodZipCode.Neighbourhood.LocationId, NeighbourhoodZipCode.ZipCode.LocationId).

Je pensais juste que je continuerais à éditer cette question avec la modification concernant l’endroit où je suis actuellement. Je commence à me demander si un TPH avec FK à auto-référencement est possible.

MODIFIER

Donc, je me suis rendu compte de l’erreur ci-dessus, c’est parce qu’il me manquait la table de jointure pour le code-voisinage de voisinage.

L’ajout de la table de jointure (et la correspondance des navs avec celle-ci) a résolu l’erreur ci-dessus.

Mais maintenant, je reçois cette erreur:

Erreur 3032: Problème lors du mappage de fragments commençant aux lignes 373 et 382: Les valeurs des conditions des membres de la condition ‘Emplacements.StateLocationId’ sont identiques.

Si je regarde la CSDL, voici la cartographie d’association pour “CountyState” (un état a plusieurs comtés, un comté a 1 état):

          

C’est cette Condition ColumnName="StateLocationId" qui se plaint, car l’association ZipCodeState également cette condition.

Mais je ne comprends pas. Les discriminateurs de toutes les entités sont uniques (j’ai vérifié trois fois), et j’aurais pensé que c’était un scénario valable:

  1. Le comté a un seul état, désigné par StateLocationId (table Locations)
  2. ZipCode a un seul état, désigné par StateLocationId (table Locations)

N’est-ce pas valable dans TPH?

J’ai donc résolu quelques-uns de mes problèmes, mais je me suis heurté à un mur de briques.

Tout d’abord, lorsque vous créez des FK auto-référencés du côté de la firebase database, lorsque vous essayez de “mettre à jour le modèle à partir de la firebase database”, Entity Framework ajoute ces propriétés de navigation au type de base principal, car il n’a pas de sens explicite de TPH. besoin de le faire dans le modèle.

MAIS, vous pouvez append manuellement les propriétés de navigation aux types enfants.

WRT cette erreur:

Erreur 3032: Problème lors du mappage de fragments commençant aux lignes 373 et 382: Les valeurs des conditions des membres de la condition ‘Emplacements.StateLocationId’ sont identiques.

C’est parce que j’avais un FK appelé “Location_State” que j’essayais d’utiliser pour la relation “ZipCode_State” ET la relation “City_State” – qui ne fonctionne toujours pas (je ne sais toujours pas pourquoi).

Donc, pour résoudre ce problème, j’ai dû append des colonnes et des FK supplémentaires – l’un appelé “ZipCode_State”, et un autre appelé “City_State” – il doit évidemment s’agir d’un 1-1 entre les navs et les FK physiques.

Location.LocationType n’a pas de valeur par défaut et n’est pas nullable. Une valeur de colonne est requirejse pour stocker les données d’entité.

C’est mon champ discriminateur. Du côté de la firebase database, il n’est pas nullable .

J’ai lu des discussions à propos de ce problème et ils m’ont dit que vous deviez changer les relations de 0 .. * à 1 .. * – mais mes relations étaient déjà 1 .. *.

Si vous regardez ma table de firebase database “Emplacements” ci-dessus, tous les FK sont nuls (ils doivent l’être). Par conséquent, j’ai commencé à me demander si mes relations devaient être 0 .. *.

Mais ils sont nuls à cause de la TPH – tous les “Emplacements” n’auront pas un “Etat”. Mais si cet endroit est une “ville”, alors il DOIT avoir un “état”.

Cette question SO me rassurait davantage: ADO EF – Cartographie des erreurs entre associations de types dérivés dans TPH

J’essayais en fait cette solution de contournement (avant même de la rencontrer), et la solution de contournement ne fonctionne pas pour moi. J’ai même essayé de changer toutes les relations de 1 .. * à 0 .. * et toujours pas de chance.

J’ai perdu trop de temps et je suis retourné au TPT.

À la fin de la journée, avec TPH, j’aurais eu une table ridiculement grande, avec beaucoup, de colonnes redondantes et nullables. JOIN-sage, c’est plus efficace. Mais au moins avec TPT, je ne suis pas obligé d’avoir des FK nullables et auto-référant.

Si quelqu’un a une solution à ce problème, faites le moi savoir. Mais jusque-là, je m’en tiens au TPT.