NHibernate отображение коллекции поиска (если это имеет смысл) - PullRequest
5 голосов
/ 26 ноября 2008

Я не уверен, как задать вопрос, потому что я не знаю, чего я не знаю, и поэтому я не знаю правильной терминологии для того, на что я пытаюсь получить ответ. Я объясню свой сценарий, в надежде, что он поможет:

У меня есть три таблицы, таблица 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 без добавления новой записи в таблицу Тегов.

Надеюсь, в этом есть хоть какой-то смысл. Дайте мне знать, если вам нужны дополнительные разъяснения. Я опубликую свое решение здесь, если выясню, прежде чем кто-то ответит.

Ответы [ 2 ]

4 голосов
/ 26 ноября 2008

Вам не нужен класс BookTag вообще. Вы можете отобразить коллекцию Book.Tags как многие ко многим. Для этого вы будете указывать BookTag на карте для подключения ассоциации. Смотрите здесь в разделе 6.8 Двунаправленные ассоциации.

3 голосов
/ 26 ноября 2008

Спасибо, Тим, это было то, что мне было нужно. Для любопытных я «удалил» таблицу / объекты BookTag, и теперь у меня просто есть объект Book и объект Tag, которые используются и отображаются в NHibernate.

Моя книга.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"/>
    <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...