2008-11-25 7 views
5

Je ne sais pas comment poser la question, car je ne sais pas ce que je ne sais pas, et donc je ne connais pas la terminologie appropriée pour ce que j'essaie d'obtenir la réponse. Je vais expliquer mon scénario, dans l'espoir que cela aidera:NHibernate cartographie de la collection de recherche (si cela a un sens)

J'ai trois tables, une table de livre, une table d'étiquette et une table de recherche de BookTag. Chaque livre a un ID, un titre (pour les débutants) Chaque étiquette a un ID et un titre Chaque BookTag a un ID, un BookID et un TagID.

Un livre peut être étiqueté avec plusieurs étiquettes et une étiquette peut être utilisée sur plusieurs BookID.

J'ai mes objets configuration de cette façon:

Book.cs 
int BookID 
string Title 
List<BookTag> Tags 

Tag.cs 
int TagID 
string Title 

BookTag.cs 
int ID 
int BookID 
int TagID 

je voudrais la classe Books.cs d'avoir une collection de mots clés, et non BookTags, mais je ne peux pas sembler obtenir le droit de cartographie dans NHibernate. Voilà ce que j'ai le fichier Book.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Books"> 
    <class name="DomainModel.Books.Book" table="Books"> 
    <id name="BookID" type="Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <property name="Title" type="String" not-null="true"/> 
    <set lazy="true" name="Tags" table="BookTags" generic="true" inverse="true" cascade="delete"> 
     <key column="BookID"/> 
     <one-to-many class="DomainModel.Books.BookTag, DomainModel"/> 
    </set> 
    </class> 
</hibernate-mapping> 

Et voici mon BookTag.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Books"> 
    <class name="DomainModel.Books.BookTag" table="BookTags"> 
    <id column="BookTagID" name="BookTagID" type="Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="Tag"> 
     <column not-null="true" name="TagID"/> 
    </many-to-one> 
    <many-to-one name="Book"> 
     <column not-null="true" name="BookID"/> 
    </many-to-one> 
    </class> 
</hibernate-mapping> 

Selon ce modèle, je peux obtenir à la balise Je veux en utilisant mon modèle d'objet: Book.Tags [0] .Tag, mais cela semble inefficace. Puis-je utiliser NHibernate pour mapper le BookTags.TagID avec Tags.TagID dans la base de données afin que je puisse obtenir Book.Tags [0] pour retourner un objet Tag, au lieu d'un objet BookTags? Je ne connaissais pas de meilleure façon d'associer Books à des balises afin qu'une balise utilisée sur Book1 puisse être utilisée sur Book2 sans ajouter de nouvelle entrée à la table Tags. J'espère que cela fait au moins un certain sens. Faites-moi savoir si vous avez besoin de plus de précisions. Je posterai ma solution ici si je la découvre avant que quelqu'un ne réponde.

+0

Merci pour cette question !!!!! ~ –

Répondre

4

Vous n'avez pas du tout besoin d'une classe BookTag. Vous pouvez mapper la collection Book.Tags autant que plusieurs. Pour ce faire, vous spécifiez BookTag dans la carte pour connecter l'association. Regardez here dans la section 6.8 Associations bidirectionnelles.

+1

Le lien est rompu. –

3

Merci Tim, c'était ce dont j'avais besoin. Pour ceux qui sont curieux, j'ai "décomposé" la table/objets BookTag, et maintenant j'ai juste un objet Book et un objet Tag qui sont utilisés et mappés à NHibernate.

Mon Book.hbm.xml a été mis à jour ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel.Books"> 
    <class name="DomainModel.Books.Book" table="Books"> 
    <id name="BookID" type="Int32" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <property name="Title" type="String" not-null="true"/> 
    <bag name="Tags" table="BookTag" generic="true"> 
     <key column="BookID" on-delete="noaction"></key> 
     <many-to-many class="Tag" column="TagID"></many-to-many> 
    </bag> 
    </class> 
</hibernate-mapping> 
Questions connexes