I'm not sure how to ask the question, for I don't know what I don't know, and therefore I don't know the proper terminology for what I'm trying to get the answer to. I will explain my scenario, in hopes that it will help:
I've got three tables, a Book table, a Tag table and a BookTag lookup table.
Each book has an ID, a Title (for starters) Each tag has an ID, and a Title Each BookTag has an ID, a BookID, and a TagID.
A book can be tagged with multiple tags, and a tag can be used on more than one BookID.
I've got my objects setup in this fashion:
Book.cs int BookID string Title List<BookTag> Tags Tag.cs int TagID string Title BookTag.cs int ID int BookID int TagID
I would like the Books.cs class to have a collection of Tags, and not BookTags, but I cannot seem to get the mapping right in NHibernate. This is what I've got for the Book.hbm.xml file:
<?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>
And this is my 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>
Under this model, I can get to the tag I want by using my object model: Book.Tags[0].Tag, but that just seems inefficient. Can I use NHibernate to map out the BookTags.TagID with the Tags.TagID in the database so that I can get Book.Tags[0] to return a Tag object, instead of a BookTags object? I didn't know of a better way to associate Books to tags so that a tag used on Book1 can be used on Book2 without adding a new entry to the Tags table.
I hope this makes at least some sense. Let me know if you need further clarification. I'll post my solution here if I figure it out before someone answers.