2011-05-11 75 views
5

以下是相關的部分。這是一個父對象:NHibernate:使用IList語義映射雙向一對多

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一個實例,添加一個ArticleRevisionArticle.Revisions收集,將ArticleRevision.Article引用Article實例和推它到數據庫:

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

Number列被插入。

如何在NHibernate中正確映射雙向一對多集合與列表語義?

回答

6

NHibernate documentation

請注意,NHibernate的不 支持雙向one-to-許多 協會與索引 的集合(list,map或者array)作爲 「多」 端,你必須使用一組或者一個包包映射。

1

據我所知,所有的ORM框架聲明,當你有雙向關係時,你應該定義一個方面,當你更新你的雙向關係的狀態時ORM將依靠它。否則,你可以得到的副作用,如

  • 不一致的映射
  • 約束違反
  • 在其他的東西

在你的情況下,列條款ArticleID可以通過兩端進行管理關係。因此,您應該將一邊標記爲inverse =「true」,當您有@OneToMany關係時應將其置於多邊。

但是,您可以通過禁用財產ArticleRevision.Article,通過設置映射爲

<many-to-one name="Article" column="ArticleID" insert="false" update="false" /> 

使用插入=「假」更新=「假」,你說達到相同的行爲: NHibernate,並不關心我,因此,NHBenate你簡單地忽略它。現在,在屬性Article.Revisions中丟棄inverse =「false」,您將得到您的答案。

UPDATE:

刪除不空=從你的鍵列,因爲它是ArticleRevision後立即更新「真」。因此,您將會受到違反約束的情況。