2009-07-24 7 views
0

J'ai une classe qui ressemble à ceci:Comment mapper deux objets qui se référencent mutuellement dans NHibernate?

public class Job 
{ 
    public Company Company {get;set;} 
    public Job JobForCompanyA {get;set;} 
    public Job JobForCompanyB {get;set;} 
} 

Les emplois pour les deux sociétés feront référence à l'autre, par exemple:

var jobA = new Job { Company = Company.CompanyA }; 
var jobB = new Job { Company = Company.CompabyB }; 
jobA.JobForCompanyB = jobB; 
jobB.JobForCompanyA = jobA; 

Le problème est que si je la carte ci comme NHibernate, il ne peut pas les sauvegarder ... puisque chaque objet Job référence l'autre, vous devez en enregistrer un pour obtenir le PK, mais vous ne pouvez pas le faire car il fait référence à l'autre (non sauvegardé) Job, donc vous avez un problème de poule et d'oeuf. Du point de vue db, je pourrais créer une table de mappage qui mappe les Jobs de la société A aux Jobs de la société B. Y at-il un moyen de mapper NHibernate sans que je doive changer l'apparence de mon objet entité? Je sais que je pourrais ajouter des propriétés de liste et des hacks pour le faire comme une relation normale de plusieurs à plusieurs, mais cela doit être un modèle pour lequel quelqu'un a une meilleure solution. J'utilise Fluent NHibernate, donc vous pouvez me donner des solutions en utilisant les mappings NHUBernate ou NHibernate XML Fluent.

+0

Si vous avez le pouvoir changer l'identité à quelque chose qui peut être fait par NHibernate pour vous (hilo, guid.comb, etc). – anonymous

+0

Je ne vois pas comment cela réglerait le problème. Le problème est qu'avec la manière dont les tables de base de données sont configurées maintenant, les FK sur la table ne permettraient jamais à un Job d'être sauvegardé sans l'ID de l'autre Job (qui n'est pas non plus sauvegardé). Donc je pense que je dois changer mon schéma de base de données. –

+0

Oublié les contraintes de DB, désolé. – anonymous

Répondre

1

Ce mappage fluide vous permettra de référencer plusieurs propriétés du même type. Ici, je suppose que dans votre tableau Job vous avez deux colonnes (JobAId et JobBId) qui référencent un autre Job (via JobId).

Références (x => x. JobForCompanyA, "JobAId"); Références (x => x. JobForCompanyB, "JobBId");

+0

C'est ce que j'ai maintenant, mais cela mène au problème de la poule et de l'oeuf où un travail ne peut être sauvé tant que l'autre n'est pas sauvé, mais comme ils se réfèrent tous les deux, aucun ne peut être sauvé. –

+1

Jon, Je pense que vous devez persister jobA et jobB AVANT de créer l'association. Cela entraînera plusieurs hits sur la base de données, mais vous donnera le résultat souhaité. La cartographie présentée ici est correcte. – wgpubs

0

Je ne vois pas comment le faire sans créer une autre entité sans aucune de ces références afin que vous puissiez obtenir des valeurs nulles sauvegardées. Enregistrez deux de ces entités factices et récupérez leurs identifiants. Ensuite, récupérez chacun d'entre eux en utilisant leurs identifiants à travers l'entité Job que vous avez déjà et réglez-les entre eux de cette façon. Vous devriez pouvoir enregistrer ensuite.

C'est moche mais c'est à peu près comme ça que vous devriez le faire en SQL quand même. Je penserais à venir avec un modèle différent si j'étais vous.

Questions connexes