помощь, необходимая для картирования Nhibernate (отношения между родителями и детьми) - PullRequest
1 голос
/ 10 июля 2009

Я новичок в Nhibernate и использую Nhibernate 2.1.0 RC1. В C # у меня есть следующие классы:

public class Application
{
    public virtual int Id { get; set; }
    public virtual Applicant Applicant { get; set; }
}

public class Applicant
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual IList<Application> Applications { get; set; } //maybe i should use set to eliminate duplicates
}

И у меня есть следующая схема базы данных в SQL Server 2005:

Applications table
{
  ApplicationId int PK IDENTITY NOTNULL
  FK_ApplicantId int FK NOTNULL
}

Applicants table
{
  ApplicantId int PK IDENTITY NOTNULL
  FirstName string NOTNULL
  LastName string NOTNULL
}

И у меня есть следующий файл сопоставления Nhibernate:

Мне нужно двунаправленное отображение:

  • 1 заявитель может иметь> 1 заявку
  • 1 заявка принадлежит 1 заявителю

Понятия не имею, как сопоставить коллекцию приложений с заявителем. Пожалуйста помоги. Спасибо! Также я не использую Fluent Nhibernate, поскольку он пока не поддерживает Nhibernate 2.1.0 RC1.

Обновлено (это рабочая версия):

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="HelloWorld"
                   namespace="HelloWorld">

  <class name="Application" table="Applications">
    <id name="Id" column="ApplicationID" />
    <property name="Reference" />

    <many-to-one name="Applicant" column="ApplicantID" not-null="true"/>
  </class>

  <class name="Applicant" table="Applicants">
    <id name="Id" column="ApplicantID" />
    <property name="FirstName" column="FirstName" />
    <property name="LastName" column="LastName" />

    <set name="Applications" inverse="true"> <!-- good to remove this mapping -->
      <key column="ApplicantID"/>
      <one-to-many class="Application"/>
    </set>
  </class>
</hibernate-mapping>

Я бы также удалил коллекцию приложений из объекта «Заявитель», чтобы уменьшить изменение загрузки тысяч приложений, поданных заявителем. Причина этого здесь. .

Ответы [ 2 ]

1 голос
/ 10 июля 2009
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="HelloWorld"
                   namespace="HelloWorld">

  <class name="Application" table="Applications">
    <id name="Id" column="ApplicationID" />
    <property name="Reference" />

    <many-to-one name="Applicant" column="ApplicantID" not-null="true"/>
  </class>

  <class name="Applicant" table="Applicants">
    <id name="Id" column="ApplicantID" />
    <property name="FirstName" column="FirstName" />
    <property name="LastName" column="LastName" />

    <set name="Applications" inverse="true">
      <key column="ApplicantID"/>
      <one-to-many class="Application"/>
    </set>
  </class>
</hibernate-mapping>
1 голос
/ 10 июля 2009

Что-то не так с вашей иерархией. Почему у заявителя есть коллекция заявок, где каждая заявка назначается другому заявителю? Пожалуйста, перепроверьте свои объекты и отношения, которые вы пытаетесь построить. Вы можете просто иметь класс приложения и класс кандидата, а приложение может иметь несколько приложений в том виде, в каком оно есть, просто имея идентификатор кандидата в классе приложения, а в базе данных вы можете иметь отношение многие к одному между приложением и заявителем, указывая что к заявителю может быть привязано несколько заявок.

...