如何在没有中间class PostTag
创建的情况下定义映射?我有三张桌子
t_post(id...)
t_tag(id, name)
t_post_tag(id,post_id, tag_id)
我想要一个带有Post类型标签的集合 类:
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>
答案 0 :(得分:5)
要映射配对表,没有显式实体来表示它,我们必须使用<many-to-many>
。同样必须存在属性table="..."
- 指示NHibernate关于该配对表。 (如果我们将标签分配到帖子中,我们应该不将此类映射标记为反向)
<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. Collections of Values and Many-To-Many Associations
具有自己的表的实体集合对应于多对多关联的关系概念。多对多关联是.NET集合中最自然的映射,但通常不是最好的关系模型。
<many-to-many
column="column_name" (1)
class="ClassName" (2)
fetch="join|select" (3)
not-found="ignore|exception" (4)
/>
(1)column(required):元素外键列的名称 (2)类(必填):相关类的名称 (3)fetch(可选,默认为join):为此关联启用外连接或顺序选择提取。这是一个特例;对于实体的完全渴望获取(在单个SELECT中)及其与其他实体的多对多关系,您不仅可以启用集合本身的连接提取,还可以在
<many-to-many>
嵌套时使用此属性元素。
(4)not-found(可选 - 默认为exception):指定如何处理引用缺失行的外键:ignore将缺少的行视为空关联。
6.8. Bidirectional Associations
双向关联允许从关联的“两端”进行导航。支持两种双向关联:
one-to-many
设置或包的一端为单值,另一端为单值many-to-many
设置或包装在两端的行李
23.2. Author/Work (包含完整示例)