NHibernate:使用IList语义映射双向一对多

时间:2011-05-11 16:52:06

标签: nhibernate nhibernate-mapping

以下是相关部分。这是一个父对象:

public class Article
{
    public virtual IList<ArticleRevision> Revisions { get; set; }
}

<list name="Revisions" cascade="all" inverse="true" table="ArticleRevision">
  <cache usage="read-write" />

  <key column="ArticleID" not-null="true" />
  <index column="Number" type="int32" />
  <one-to-many class="ArticleRevision" />
</list>

这是一个孩子:

public class ArticleRevision
{
    public virtual Article Article { get; set; }
}

<many-to-one name="Article" column="ArticleID" not-null="true" />

现在,我创建了一个Article的实例,将一个ArticleRevision添加到Article.Revisions集合,设置ArticleRevision.Article以引用Article实例并将其推送到数据库:

INSERT 
INTO
    ArticleRevision
    (Content, Keywords, CreatedAt, SiteID, ArticleID, CreatedByUserID, ID) 
VALUES
    (@p0, @p1, @p2, @p3, @p4, @p5, @p6);

未插入Number列。

如何在NHibernate中使用列表语义正确映射双向一对多集合?

2 个答案:

答案 0 :(得分:6)

来自NHibernate documentation

  

请注意NHibernate没有   支持双向一对多   与索引的关联   集合(列表,映射或数组)作为   “很多”结束,你必须使用一套或   包映射。

答案 1 :(得分:1)

据我所知,所有ORM框架都声明,当你有双向关系时,你应该定义一方,在更新双向关系的状态时你的ORM将依赖于这一方。否则,您可以获得副作用,例如

  • 映射不一致
  • 违反约束
  • 其他内容

在您的情况下,列ArticleID可以由关系的两端管理。因此,您应将一侧标记为 inverse =“true”,当您拥有@OneToMany关系时,应将其放在多方面。

但是,您可以通过将其映射设置为

来禁用属性ArticleRevision.Article来实现相同的行为。
<many-to-one name="Article" column="ArticleID" insert="false" update="false" />

使用 insert =“false”update =“false”,你说:NHibernate,不关心我,因此,NHibenate你只是忽略它。现在,在属性Article.Revisions中丢弃 inverse =“false”,您将得到答案。

更新:

从您的键列中删除 not-null =“true”,因为它在ArticleRevision之后立即更新。因此,否则会出现约束违规。