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