NHibernate用中间表映射一对多关系

本文关键字:一对多 关系 映射 中间 NHibernate | 更新日期: 2023-09-27 17:53:11

如何定义没有中间class PostTag创建的映射?我有三个表

t_post(id...)
t_tag(id, name)
t_post_tag(id,post_id, tag_id)

我想有一个集合与标签在帖子类型类:

class Post
{
    public virtual IEnumerable<Tag> Tags{ get; set; }
}
public class Tag
{
}

映射:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Sample.Core" namespace="Sample.Core.Domain.Model" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Post" table="t_post" lazy="true" >
    <id name="Id" column="id" type="System.Int64" unsaved-value="-1"  generator="identity">
    </id>
...
    <bag name="Tags" lazy="true" cascade="none" inverse="true">
      <key column="post_id"/>
      <one-to-many class="Tag" />
    </bag>
  </class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Sample.Core" namespace="Sample.Core.Domain.Model" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Tag" table="t_tag" lazy="true" >
    <id name="Id" column="id" type="System.Int64" unsaved-value="-1"  generator="identity">
    </id>
  </class>
</hibernate-mapping>

NHibernate用中间表映射一对多关系

要映射配对表,没有显式的实体表示,我们必须使用<many-to-many>。此外,属性table="..."必须存在-指示NHibernate关于配对表。(如果我们将标签分配到Posts中,我们应该而不是将这种映射标记为逆)

<bag name="Tags" table="t_post_tag"
    lazy="true" cascade="none" inverse="true">
  <key column="post_id"/>
  <!--<one-to-many class="Tag" />-->
  <many-to-many class="Tag" column="tag_id"/>
</bag>

6.3。值的集合和多对多关联

具有自己表的实体集合对应于多对多关联的关系概念。多对多关联是. net集合最自然的映射,但通常不是最好的关系模型。

<many-to-many
    column="column_name"                               (1)
    class="ClassName"                                  (2)
    fetch="join|select"                                (3)
    not-found="ignore|exception"                       (4)
/>

(1) column (required):元素外键列的名称。
(2) class(必选):关联类的名称。
(3) fetch(可选,默认为join):为该关联启用外连接或顺序选择抓取。这是一个特例;对于一个实体及其与其他实体的多对多关系的完全热切抓取(在单个SELECT中),您不仅可以启用集合本身的连接抓取,还可以启用<many-to-many>嵌套元素上的此属性的连接抓取。
(4) not-found(可选-默认为exception):指定如何处理引用缺失行的外键:ignore将将缺失行视为空关联。

6.8。双向关联

双向关联允许从关联的"两端"进行导航。支持两种双向关联:
  • one-to-many set or bag一端值,另一端单值
  • many-to-many set or bag两端值

23.2。作者/作品(包含完整示例)