NHibernate查找集合的映射(如果有意义的话)

时间:2021-05-16 02:14:07

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.

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

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.

每本书都有一个ID,一个标题(对于初学者)每个标签都有一个ID,标题每个BookTag都有一个ID,一个BookID和一个TagID。

A book can be tagged with multiple tags, and a tag can be used on more than one BookID.

可以使用多个标签标记书籍,并且可以在多个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:

我希望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>

And this is my BookTag.hbm.xml:

这是我的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.

在这个模型下,我可以通过使用我的对象模型得到我想要的标签:Book.Tags [0] .Tag,但这看起来效率低下。我可以使用NHibernate将BookTags.TagID映射到数据库中的Tags.TagID,以便我可以让Book.Tags [0]返回Tag对象,而不是BookTags对象吗?我不知道将Books与标签关联的更好方法,以便可以在Book2上使用Book1上使用的标签,而无需在Tags表中添加新条目。

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.

我希望这至少有一定意义。如果您需要进一步澄清,请与我们联系。如果我在有人回答之前搞清楚,我会在这里发布我的解决方案。

2 个解决方案

#1


4  

You don't need a BookTag class at all. You can map Book.Tags collection as many-to-many. To do this you will specify BookTag in the map to connect the association. Look here in section 6.8 Bidirectional Associations.

您根本不需要BookTag类。您可以将Book.Tags集合映射为多对多。为此,您将在地图中指定BookTag以连接关联。请参见6.8章节双向关联。

#2


3  

Thank you Tim, that was what I needed. For those that are curious, I "un-mapped" the BookTag table/objects, and now just have a Book object and a Tag object that are used and mapped to NHibernate.

谢谢蒂姆,这就是我所需要的。对于那些好奇的人,我“取消映射”BookTag表/对象,现在只有一个Book对象和一个Tag对象被使用并映射到NHibernate。

My Book.hbm.xml was updated to this:

我的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>

#1


4  

You don't need a BookTag class at all. You can map Book.Tags collection as many-to-many. To do this you will specify BookTag in the map to connect the association. Look here in section 6.8 Bidirectional Associations.

您根本不需要BookTag类。您可以将Book.Tags集合映射为多对多。为此,您将在地图中指定BookTag以连接关联。请参见6.8章节双向关联。

#2


3  

Thank you Tim, that was what I needed. For those that are curious, I "un-mapped" the BookTag table/objects, and now just have a Book object and a Tag object that are used and mapped to NHibernate.

谢谢蒂姆,这就是我所需要的。对于那些好奇的人,我“取消映射”BookTag表/对象,现在只有一个Book对象和一个Tag对象被使用并映射到NHibernate。

My Book.hbm.xml was updated to this:

我的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>