我不知道如何提出这个问题,因为我不知道我不知道什么,因此我不知道我正在试图得到答案的正确术语。我将解释我的情景,希望它会有所帮助:
我有三个表,一个Book表,一个Tag表和一个BookTag查找表。
每本书都有一个ID,一个标题(适合初学者) 每个标签都有一个ID和一个标题 每个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类有一个Tags集合,而不是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对象吗?我不知道将Books与标签关联的更好方法,以便可以在Book2上使用Book1上使用的标签,而无需在Tags表中添加新条目。
我希望这至少有一定意义。如果您需要进一步澄清,请与我们联系。如果我在某人回答之前弄明白,我会在这里发布我的解决方案。
答案 0 :(得分:4)
您根本不需要BookTag课程。您可以将Book.Tags集合映射为多对多。为此,您将在地图中指定BookTag以连接关联。请参阅第6.8节“双向关联”中的here。
答案 1 :(得分:3)
我的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"/>
<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>