Nhibernate映射需要帮助(父/子关系)

时间:2009-07-10 01:53:53

标签: nhibernate nhibernate-mapping

我是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申请人可以拥有&gt; 1个申请
  • 1个申请属于1个申请人

我不知道如何将Application集合映射到Applicant。请帮忙。谢谢! 另外我没有使用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>

我还会从Applicant对象中删除Application集合,以减少申请人提交的数千个应用程序的负载变化。 Reason for this is here.

2 个答案:

答案 0 :(得分:1)

你的heirarchy有问题。为什么申请人拥有一份应用程序集合,其中每个应用程序都分配给另一个申请人?请重新检查您的对象以及您尝试构建的关系。您可以拥有一个Application类和一个Applicant类,一个Application可以通过简单地在Application类和数据库中拥有申请者ID来拥有多个应用程序,您可以在申请和申请人之间建立多对一的关系可以有多个应用程序绑定到申请人。

答案 1 :(得分:1)

<?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>