2010-02-09 7 views
0

Disons que je suis une classe/table appelée Images qui, tel qu'il est en ce moment, est lié d'une manière similaire à ceci:NHibernate Cartographie d'une collection avec un discriminateur

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Domain.Image, Domain" table="Images"> 
    <id name="id" column="ImageID" access="field" unsaved-value="0"> 
     <generator class="identity" /> 
    </id>  
<!-- other properties --> 
    <property name="AssociatedObjectID" column="AssociatedObjectID" /> 
    <property name="AssociatedObjectType" column="AssociatedObjectType" /> 
    </class> 
</hibernate-mapping> 

Jusqu'à ce point, ce schéma a fonctionné, parce qu'une image était seulement associée à un objet, ainsi je pourrais garder cette référence sans discriminateur.

Cependant, maintenant je veux avoir une collection de ces images sur une autre entité appelée PhotoShoot. Chaque PhotoShoot peut avoir plusieurs images.

Existe-t-il un moyen de lier une collection de sorte que je puisse avoir un List<Image> dans PhotoShoot sans extraire une classe de base et en utilisant le modèle d'héritage de table par hiérarchie?

Et sinon, est une table par hiérarchie vraiment la meilleure façon d'y aller? Je déteste créer des sous-classes, d'autant plus qu'il n'y a rien qui doit être soustrait de l'entité Image.

Répondre

1

Je carte cela comme une IList <Images> propriété sur PhotoShoot, cartographié par une table de jointure (many-to-many).

Si l'ordre de la liste est importante, la carte comme une liste sinon comme un sac. J'ai inclus les deux mappings. En utilisant le mappage de classe original de @ ddango, nous pourrions faire ce qui suit.

<class name="Domain.PhotoShoot, Domain" table="PhotoShoot"> 
    <bag name="Images" table="Image" fetch="join" where="AssociatedObjectType='PhotoShoot'"> 
     <key column="AssociatedObjectId"/> 
     <one-to-many class="Domain.Image, Domain" /> 
    </bag> 
</class> 
+0

C'est ce que je cherche à faire, sauf dans ce cas, la colonne de clé est une combinaison de AssociatedObjectId = PhotoShootId et AssociatedObjectType = « PhotoShoot ». Il serait possible que le AssociatedObjectId est le même pour une autre image, donc je tirerais images que je ne veux pas. – ddango

0

Vous pouvez utiliser un grand nombre à plusieurs tables de mappage, plutôt que de mettre le AssociatedObjectId/Tapez votre classe d'image/table. Beaucoup à-manys sont un peu plus difficiles à travailler dans Hibernate, mais vous donner une flexibilité supplémentaire.

Image 
----- 
Id (PK) 
OtherProp1 
OtherProp2 

Attachment 
---------- 
Id (PK) 
OtherProp1 

AttachmentImage (many-to-many between Attachment and Images) 
--------------- 
ImageId (PK, FK to Image.Id) 
AttachmentId (PK, FK to Image.Id) 

PhotoShoot 
---------- 
Id (PK) 
OtherProp1 
-- AttachmentId (if PhotoShoot has only a single attachment) 

PhotoShootAttachment (if Photoshoot can have many attachments) 
-------------------- 
ImageId (PK, FK to Image.Id) 
AttachmentId (PK, FK to Attachment.Id) 
Questions connexes