7

这是NHibernate中单向一对一映射的问题。

学生.cs

public class Student
{
    public int ID { get; set; }
    public int Roll { get; set; }
    public int RegNo { get; set; }
    public string Name { get; set; }

    public StudentDetail StudentDetail { get; set; }
}

StudentDetail.cs

public class StudentDetail
{
    public int ID { get; set; }

    public string Father { get; set; }
    public string Mother { get; set; }
}

如何将这些类(hbm 映射文件看起来如何)映射到以下一对一关系的情况?

替代文字

请仔细查看课程和表格。

我可以把<many-to-one>标签放在哪里Student.hbm.xmlStudentDetail.hbm.xml如果我把它放进去Student.hbm.xml,我怎么能映射列StudentDetail.StudentID,因为它在另一个表中?

所以这个映射:

<class name="Student" table="Student">
    <id name="ID" column="ID">
      <generator class="native"/>
    </id>

    .......

    <many-to-one class="StudentDetail" name="StudentDetail" column="StudentID" unique="true" cascade="all" />
  </class>

生成以下异常:

{"Invalid column name 'StudentID'."}

另一方面<many-to-one>不能放在StudentDetail.hbm.xml. Coz,StudentDetail.cs不包含任何类型的属性Student

我可以使用<one-to-one>-tag 吗?如果是,我应该把它放在哪里,在Student.csStudentDetail.cs?我应该如何配置它?

4

2 回答 2

5

情况1:

在学生...

<one-to-one name="StudentDetail" 
            cascade="save-update,delete" 
            property-ref="Student" />

在学生详细...

<many-to-one name="Student" 
             column="StudentID" 
             unique="true" 
             cascade="none" />

请注意,您的 StudentDetail 类中必须有一个引用 Student 对象(称为 Student)的属性。此外,根据您的使用情况,您的级联可能会有所不同。不过,您很可能希望在其中删除级联。

unique="true"确保了 StudentDetail 端的一对一映射。

案例2:

只需交换两个映射,确保将属性名称更改为相反的类。

在这里查看更多信息: http: //nhforge.org/blogs/nhibernate/archive/2009/04/19/nhibernate-mapping-lt-one-to-one-gt.aspx

于 2010-06-07T16:16:48.107 回答
2

您可以将其映射为一对多,隐藏集合属性,仅公开其第一个元素:

public class Student
{
    public virtual int ID { get; set; }
    public virtual int Roll { get; set; }
    public virtual int RegNo { get; set; }
    public virtual string Name { get; set; }

    protected virtual IList<StudentDetail> StudentDetails { get; set; }

    public virtual StudentDetail StudentDetail
    {
        get
        {
            if (StudentDetails.Count == 0) return null;
            return StudentDetails[0];
        }
        set
        {
            if (StudentDetails.Count != 0) throw new Exception();
            StudentDetails.Add(value);
            value.Student = this;
        }
    }
}

您可以比这更好地处理 setter - 关键是确保您不会将多行添加到一对多。显然,在此,StudentDetails被映射但StudentDetail不在您的 .hbm.xml 或 Fluent 映射中。

于 2010-06-07T16:14:25.817 回答