如何做这个单向NHibernate一对一映射?

use*_*312 7 nhibernate one-to-one

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

Student.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; }
}
Run Code Online (Sandbox Code Playgroud)

StudentDetail.cs

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

    public string Father { get; set; }
    public string Mother { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

替代文字

请仔细查看课程和表格.

我在哪里可以把<many-to-one>标签中Student.hbm.xml还是StudentDetail.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>
Run Code Online (Sandbox Code Playgroud)

生成以下异常:

{"Invalid column name 'StudentID'."}
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*yer 5

情况1:

在学生...

<one-to-one name="StudentDetail" 
            cascade="save-update,delete" 
            property-ref="Student" />
Run Code Online (Sandbox Code Playgroud)

在StudentDetail ...

<many-to-one name="Student" 
             column="StudentID" 
             unique="true" 
             cascade="none" />
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在StudentDetail类中拥有一个引用Student oobject(称为Student)的属性.此外,根据您的使用情况,您的级联可能会有所不同.不过,你最有可能想要删除级联.

unique="true"确保在StudentDetail侧的一对一的映射.

案例#2:

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

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


Dav*_*d M 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以比这更好地处理设置器 - 重点是确保您不会将多行添加到一对多中。显然,在这里,StudentDetails已映射,但StudentDetail不在您的 .hbm.xml 或 Fluent 映射中。