0

教師は生徒と 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 が動作しませんでした。

4

1 に答える 1

1

この問題を回避する唯一の方法は、プロパティをマップすることですが、基本の Teacher は既に Student 階層にマップされているため、これは重複です。

SpecialStudentマッピング ファイルでプロパティをマッピングしていないため、これは重複ではありませんSpecialTeacherSpecialTeacherコードで関係を正しく定義しましたが、NHibernate は aが a を持っていると想定されていることを知る方法がありませんSpecialStudent。このコードは、NHibernate がテーブルからオブジェクトを再作成するために使用されますが、マッピングで正しい関係を定義した場合に限ります。

BaseTeachertoは関係を意味するものでBaseStudentはないことに注意してください。SpecialTeacherSpecialStudent

于 2013-01-16T15:25:01.727 に答える