NHibernate一对一映射

时间:2011-03-03 11:37:15

标签: c# asp.net nhibernate nhibernate-mapping

我是NHibernate的新手所以到目前为止对映射等的接触有限,而且我只是遇到了一些需要帮助的场景。

我有两张桌子:

评论 TaggedReviews

我有两个看起来像这样的类(我为了简洁而排除了非重要的属性):

评分

public virtual int ReviewId { get; set; }
public virtual TaggedReview TaggedReview { get; set; }
public virtual string Title { get; set; }
public virtual string Descrip { get; set; }

TaggedReview

public virtual int ReviewId { get; set; }
public virtual Review Review { get; set; }
public virtual string TaggedReviewDescrip { get; set; }

我的NHibernate这些表/类的XML映射文件目前如下(为简洁起见编辑):

Review.hbm.xml

<class xmlns="urn:nhibernate-mapping-2.2" name="Review" table="Reviews">
    <id name="ReviewId" unsaved-value="0">
        <column name="ReviewId"></column>
        <generator class="native" />
    </id>

    <property name="Title" not-null="true" />
    <property name="Descrip" not-null="true" />
    <one-to-one name="TaggedReview" class="TaggedReview" /> <!-- This is probably very wrong?! -->
</class>

TaggedReview.hbm.xml

<class xmlns="urn:nhibernate-mapping-2.2" name="TaggedReview" table="TaggedReviews">
    <id name="ReviewId">
        <column name="ReviewId"></column>
        <generator class="native"/>
    </id>
    <one-to-one name="Review" class="Review" /> <!-- This is probably very wrong?! -->
    <property name="TaggedReviewDescrip" not-null="true" />
</class>

属性'ReviewId'是'Reviews'表的PK。它是'TaggedReviews'表中的FK。

对于评论表中的每个记录/行,TaggedReviews表中总共有1条记录/行 - 不多也不少。

我也不确定'TaggedReview'类,因为该表没有PK,只有一个FK用于评论表(ReviewId),但看起来映射文件需要一个id元素,所以不确定关于这个!

有人可以建议如何最好地配置此映射吗?

1 个答案:

答案 0 :(得分:12)

Ayende对一对一映射here有一个很好的解释。

在您的情况下,映射应该如下所示:

<强> Review.hbm.xml

<class xmlns="urn:nhibernate-mapping-2.2" name="Review" table="Reviews">
    <id name="ReviewId" unsaved-value="0">
        <column name="ReviewId"></column>
        <generator class="native" />
    </id>

    <property name="Title" not-null="true" />
    <property name="Descrip" not-null="true" />
    <one-to-one name="TaggedReview"
                      constrained="true"
                      foreign-key="none" 
                      class="TaggedReview" /> 
<!-- foreign-key="none", to prevent circular reference at insert -->
</class>

<强> TaggedReview.hbm.xml

您很可能需要表中的主键,因为您不能对键和外键使用相同的列。

<class xmlns="urn:nhibernate-mapping-2.2" name="TaggedReview" table="TaggedReviews">
    <id name="SomeOtherId">
        <column name="SomeOtherId"></column>
        <generator class="native"/>
    </id>
    <many-to-one name="Review" 
                 unique="true"
                 class="Review"> <!-- Use many-to-one for a foreign key -->
      <column name="ReviewId" />
    </many-to-one>
    <property name="TaggedReviewDescrip" not-null="true" />
</class>

如果您不能或不想更改数据库,可以查看NHibernate mapping - one-to-one (or one-to-zero)