Я не уверен, как задать вопрос, потому что я не знаю, чего я не знаю, и поэтому я не знаю правильной терминологии для того, на что я пытаюсь получить ответ. Я объясню свой сценарий, в надежде, что он поможет:
У меня есть три таблицы, таблица Book, таблица Tag и таблица поиска BookTag.
Каждая книга имеет идентификатор, название (для начинающих)
Каждый тег имеет идентификатор и заголовок
Каждый BookTag имеет идентификатор, BookID и TagID.
Книга может быть помечена несколькими тегами, и тег можно использовать для нескольких BookID.
Мои объекты настроены таким образом:
Book.cs
int BookID
string Title
List<BookTag> Tags
Tag.cs
int TagID
string Title
BookTag.cs
int ID
int BookID
int TagID
Мне бы хотелось, чтобы класс Books.cs имел коллекцию тегов, а не BookTags, но мне кажется, что я не могу получить правильное отображение в NHibernate. Вот что у меня есть для файла 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>
А это мой 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>
В этой модели я могу добраться до нужного тега, используя мою объектную модель: Book.Tags [0] .Tag, но это кажется неэффективным. Могу ли я использовать NHibernate для сопоставления BookTags.TagID с Tags.TagID в базе данных, чтобы я мог получить Book.Tags [0] для возврата объекта Tag вместо объекта BookTags? Я не знал, как лучше связать Книги с тегами, чтобы тег, используемый в Книге 1, мог использоваться в Книге 2 без добавления новой записи в таблицу Тегов.
Надеюсь, в этом есть хоть какой-то смысл. Дайте мне знать, если вам нужны дополнительные разъяснения. Я опубликую свое решение здесь, если выясню, прежде чем кто-то ответит.