c# – NHibernate一对一映射

前端之家收集整理的这篇文章主要介绍了c# – NHibernate一对一映射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是NHibernate的新手,所以到目前为止,我已经限制了映射等等,而且我刚刚打了一个需要一些帮助的场景.

我有2个表:

评测
TaggedReviews

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

评论

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”是“评论”表的PK.这是“TaggedReviews”表中的FK.

“记录表”中每个记录/行的TaggedReviews表中总共有1条记录/行 – 没有更多,不能少.

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

任何人都可以建议如何最佳地配置此映射?

解决方法

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).

猜你在找的C#相关文章