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; } }
}