Сопоставление "один-к-одному" 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; }

Мои файлы сопоставления XML файлов NHibernate для этих таблиц/классов в настоящее время выглядят следующим образом (отредактированы для краткости):

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 для таблицы 'Reviews'. Это FK в таблице "TaggedReviews".

В таблице TaggedReviews для каждой записи/строки таблицы отзывов есть ALWAYS 1 запись/строка - не более, не менее.

Я также не знал о классе TaggedReview, поскольку эта таблица имеет NO PK, просто FK для таблицы Reviews (ReviewId), но похоже, что файл сопоставления нуждался в элементе id там, поэтому не был уверен об этом тоже!

Кто-нибудь может посоветовать, как наилучшим образом настроить это сопоставление?

Ответ 1

Ayende имеет хорошее объяснение для взаимно-однозначных сопоставлений здесь.

В вашем случае сопоставление должно выглядеть следующим образом:

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>

Если вы не можете или не хотите изменять db, вы можете взглянуть на сопоставление NHibernate - один к одному (или один к нулю).