我不确定如何问这个问题,因为我不知道我不知道的东西,因此我不知道要获得答案的正确术语。我将解释我的情况,希望对您有所帮助:

我有三个表,一个Book表,一个Tag表和一个BookTag查找表。

每本书都有一个ID,一个Title(适用于初学者)
每个标签都有一个ID和一个Title
每个BookTag都有一个ID,一个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类具有一个Tag集合,而不是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在数据库中使用Bookmark.TagID映射BookTags.TagID,以便可以让Book.Tags [0]返回Tag对象,而不是BookTags对象吗?我不知道将书与标签相关联的更好方法,以便可以在Book2上使用Book1上使用的标签,而无需在“标签”表中添加新条目。

我希望这至少是有道理的。让我知道是否需要进一步说明。如果在有人回答之前弄清楚了,我将在这里发布我的解决方案。

最佳答案

您根本不需要BookTag类。您可以将Book.Tags集合映射为多对多。为此,您将在 map 中指定BookTag以连接关联。在6.8双向关联中查看here

10-04 14:19