Nhibernate 查询层次结构到层次结构关系时出现问题

Nhibernate 查询层次结构到层次结构关系时出现问题,nhibernate,nhibernate-mapping,linq-to-nhibernate,Nhibernate,Nhibernate Mapping,Linq To Nhibernate,老师和学生一对一 特殊教师延伸教师,但专门处理特殊学生 在层次结构中使用每个类的表 public class Teacher { public virtual int Id { get; set; } public virtual int DepartmentId { get; set; } public virtual String Name { get; set; } public virtual Studen

老师和学生一对一

特殊教师延伸教师,但专门处理特殊学生

在层次结构中使用每个类的表


    public class Teacher
    {
        public virtual int Id { get; set; }
        public virtual int DepartmentId { get; set; }
        public virtual String Name { get; set; }
        public virtual Student Student { get; set; }
    }

    public class SpecialTeacher : Teacher
    {
        public virtual string TelephoneNumber { get; set; } //SpecialTeachers get to have a phone
        public virtual SpecialStudent SpecialStudent { get { return (SpecialStudent)base.Student; } set { Student = value; } }
    }

    public class Student
    {
        public virtual int Id { get; set; }
        public String Name { get; set; }
    }

    public class SpecialStudent : Student
    {
        public int SpecialMark { get; set; }
    }
以及相关的映射:

<class name="Student">
    <id name="Id" />
    <property name="Name" />
</class>

<joined-subclass name="SpecialStudent" extends="Student">
  <key column="Id" />
  <property name="SpecialMark" />
</joined-subclass>

<class name="Teacher">
  <id name="Id" />
  <property name="DepartmentId" />
  <property name="Name" />

  <many-to-one name="Student" column="StudentId" />
</class>

<joined-subclass name="SpecialTeacher" extends="Teacher">
  <key column="Id" />
  <property name="TelephoneNumber" />
</joined-subclass>
它看起来确实可以正常工作,但Envers在检索已审核数据时无法使用它

我能想到的避免这个问题的唯一方法是映射属性,但这是重复的,因为基础教师已经映射到学生层次结构

这不是重复,因为您从未在
specialTech
映射文件中映射
SpecialStudent
属性。尽管您在代码中正确定义了关系,但NHibernate无法知道
specialTech
应该有
SpecialStudent
。NHibernate使用该代码从表中重新创建对象,但前提是您在映射中定义了正确的关系


请记住,
BaseTeacher
BaseStudent
并不意味着
SpecialTeacher
SpecialStudent
的关系。

那么这将如何映射?我在SpecialTech映射文件中添加了多对一,但它抱怨StudentId是无效的列名。大概是因为它想在特殊的学生桌上找到它。我每堂课用一张桌子,所以它不在那里。有没有办法让它引用BaseStudent中的StudentId属性,或者我必须为此向SpecialTech添加映射?谢谢。在映射中,您在哪里定义
StudentId
列?我只看到
Id
。StudentId列通过教师表映射。StudentId列位于教师表上。无需更改。但是,
StudentId
列需要在
specialTech
映射文件中定义,因为我不相信NHibernate会让它从基本映射继承它。看一看。
    public double GetAverageScoreForSpecialStudentsByDepartment(int departmentId)
    {
        return CurrentSession.Query<SpecialTeacher>()
            .Where(st => st.DepartmentId == departmentId)
            .Average(ss => ss.SpecialStudent.SpecialMark);
    }
public class SpecialTeacher : Teacher
{
    public virtual string TelephoneNumber { get; set; } //SpecialTeachers get to have a phone
    public virtual new SpecialStudent Student { get { return (SpecialStudent)base.Student; } set { Student = value; } }
}