以下是相关部分。这是一个父对象:
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中使用列表语义正确映射双向一对多集合?
答案 0 :(得分:6)
请注意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之后立即更新。因此,否则会出现约束违规。