1

J'ai deux tables qui ont un 1 à 1 .. * relation (ce qui signifie qu'il y aura toujours un enregistrement dans la table « Status » pour un ID spécifiqueAPI Courant et la construction d'un 1:. * Relation

|Area|    |  Status  | 
------    ------------------- 
|[Key] ID | ----> |[Key]  ID  | 
|  Name|   |[Key] Start Date | 
         |  End Date | 

J'ai les relations construites dans mon dataLayer comme suit.

zone

HasMany(s => s.Statuses) 
    .WithRequired() 
    .HasForeignKey(s => s.Id); 

Statut

HasRequired(a => a.Area) 
    .WithMany(s => s.Statuses) 
    .HasForeignKey(s => s.Id); 

J'ai une méthode générique 'AllIncluding' que j'utilise pour rassembler les données associées. Dans le débogueur, je peux voir la requête et copier/coller dans ma base de données Oracle et l'exécuter. Cela fonctionne comme je m'y attends et renvoie le nombre de lignes approprié.
Le problème est qu'après l'exécution dans le débogueur je parcourt le jeu d'enregistrements et trouve un ensemble de données entièrement différent (un ensemble réduit). Je pense que c'est parce que j'ai les clés définies comme décrit dans le diagramme. Je peux créer des erreurs concernant ... the upper bound of the multiplicity of the Dependent Role must be '1' et également modifier le jeu d'enregistrements renvoyé dans le débogueur en modifiant simplement la clé sur la table d'état. Cela semble indiquer que la relation d'enregistrement tente de supprimer des doublons dans la table d'état pour créer la jointure? J'ai essayé de recréer ceci dans Oracle en faisant un group by trunc(start_date) ou d'autres requêtes semblables mais ne peux pas frapper le résultat exact des rangées exactes.
Il a seulement confirmé ma suspicion que le mappage et la relation définis dans l'API Fluent doivent être faux, mais je ne suis pas sûr de savoir comment le représenter correctement.

Finalement, j'aimerais simplement créer une relation 1 -> 1 .. * dans l'API Fluent.

Merci!

+0

Il serait utile de voir les définitions de classe. Il semble que 'Status' est en réalité une classe de jonction entre' Area' et une table de statut qui stocke les statuts 'réels', sinon une relation many-to-many semble plus appropriée. Mais il est vraiment difficile de reconstituer ce qui se passe à partir de votre description. –

Répondre

1

Il n'a fait que confirmer mes soupçons que la cartographie et de la relation définie dans l'API Fluent doit être mal

  1. Soyez très prudent lors du mappage des relations avec les API Fluent. Plus précisément, les surcharges de méthode With utilisées doivent correspondre exactement à la présence/absence d'une propriété de navigation. WithRequired() et .WithRequired(a => a.Statuses) sont totalement différents. Utilisez le premier lorsque vous n'avez pas la propriété de navigation, et le dernier dans le cas contraire. Dans votre cas, vous avez utilisé à tort la surcharge sans paramètre.

  2. Toujours configurer les relations en un seul endroit. La relation est une chose impliquant deux entités - il n'est pas nécessaire de la dupliquer à deux endroits, et plus important encore, elle est sujette aux erreurs. Actuellement, vous avez deux définitions, une correcte (pour Status) et une incorrecte (pour Area). L'effet net est que EF les considère comme deux relations différentes, ce qui conduit à des résultats incorrects.

Alors, supprimez le code de Area et laisser le code dans le Status comme il est:

HasRequired(s => s.Area) 
    .WithMany(a => a.Statuses) 
    .HasForeignKey(s => s.Id); 

ou supprimer le code de Status et utiliser les éléments suivants dans le Area:

HasMany(a => a.Statuses) 
    .WithRequired(s => s.Area) 
    .HasForeignKey(s => s.Id); 
+0

J'ai tenté de supprimer la relation de la table Area mais j'ai commencé à recevoir une erreur indiquant que la valeur Area_Id était introuvable. Je comprends que c'est dû à la relation n'étant pas définie, donc ajouté la clause .HasForeignKey(). – McArthey

+0

Je pense que vous pouvez être sur quelque chose parce que j'ai changé la clé dans ma table d'état pour inclure d'autres et voir de nouveaux résultats – McArthey

+0

Selon ce que vous avez montré, il ne doit y avoir aucune colonne 'Area_Id' dans la table, parce que votre configuration le 'Status.ID' devrait être le FK à' Area'. J'espère que vous avez aussi utilisé quelque chose comme 'HaskKey (s => new {s.Id. s.StartDate}' dans la configuration 'Status'.) De toute façon, sans voir les classes d'entités exactes et la configuration complète, je ne peux rien dire de plus. –