教師は生徒と 1 対 1 で会話します。
SpecialTeacher は Teacher を拡張しますが、特に SpecialStudents を扱います。
階層内のクラスごとにテーブルを使用します。
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>
では、特定の学科の SpecialStudents の平均点を取得したいとしましょう。
public double GetAverageScoreForSpecialStudentsByDepartment(int departmentId)
{
return CurrentSession.Query<SpecialTeacher>()
.Where(st => st.DepartmentId == departmentId)
.Average(ss => ss.SpecialStudent.SpecialMark);
}
SpecialStudent が SpecialTeacher のマップされたプロパティではないというエラーが表示されるため、テストは失敗します。
この問題を回避する唯一の方法は、プロパティをマップすることですが、基本の Teacher は既に Student 階層にマップされているため、これは重複です。
アップデート
また、以前は SpecialTeacher を次のように設定していたことにも言及するつもりでした。
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; } }
}
これは正常に動作しているように見えましたが、監査済みデータを取得するときに Envers が動作しませんでした。