2008-11-25 17 views
5

No estoy seguro de cómo hacer la pregunta, porque no sé lo que no sé y, por lo tanto, no conozco la terminología adecuada para lo que estoy tratando de obtener la respuesta. Explicaré mi escenario, con la esperanza de que ayude:Mapeo NHibernate de la colección de búsqueda (si tiene sentido)

Tengo tres tablas, una mesa Book, una tabla Tag y una tabla de búsqueda BookTag.

Cada libro tiene una identificación, un título (para los principiantes) Cada etiqueta tiene una identificación, y un título Cada BookTag tiene un ID, un BookID, y un TagID.

Un libro se puede etiquetar con varias etiquetas, y una etiqueta se puede utilizar en más de un BookID.

Tengo mi configuración de los objetos de esta manera:

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

Tag.cs 
int TagID 
string Title 

BookTag.cs 
int ID 
int BookID 
int TagID 

Me gustaría que la clase Books.cs a tener una colección de etiquetas, y no BookTags, pero me parece que no puede obtener el derecho de asignación en NHibernate. Esto es lo que tengo para el archivo 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> 

y este es mi 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> 

Bajo este modelo, puedo llegar a la etiqueta Quiero usar mi modelo de objetos: Book.Tags [0] .Tag, pero eso parece ineficiente. ¿Puedo usar NHibernate para trazar BookTags.TagID con Tags.TagID en la base de datos para que pueda obtener Book.Tags [0] para devolver un objeto Tag, en lugar de un objeto BookTags? No sabía de una mejor manera de asociar libros a etiquetas para que una etiqueta utilizada en Book1 se pueda usar en Book2 sin agregar una nueva entrada a la tabla de etiquetas.

Espero que esto tenga algo de sentido. Avíseme si necesita más aclaraciones. Voy a publicar mi solución aquí si la descubro antes de que alguien responda.

+0

gracias por esta pregunta !!!!! ~ –

Respuesta

4

No necesita una clase BookTag en absoluto. Puede asignar la colección Book.Tags como many-to-many. Para hacer esto, especificará BookTag en el mapa para conectar la asociación. Mire here en la sección 6.8 Asociaciones bidireccionales.

+1

El enlace está roto. –

3

Gracias Tim, eso era lo que necesitaba. Para aquellos que son curiosos, "des-mapeé" la tabla/objetos BookTag, y ahora solo tengo un objeto Book y un objeto Tag que se usan y se asignan a NHibernate.

Mi Book.hbm.xml se ha actualizado para esto:

<?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> 
Cuestiones relacionadas