NHibernate Индивидуальное картографирование - PullRequest
12 голосов
/ 03 марта 2011

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

В таблице TaggedReviews ВСЕГДА есть 1 запись / строка для каждой записи / строки в таблице Reviews - не больше, не меньше.

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

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

1 Ответ

12 голосов
/ 03 марта 2011

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

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

Обзор.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 - один к одному (или один к нулю) .

...