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