1

Nhibernate ユーザー、専門家、専門家、および開発者が期待されています。助けてください !!!

2 つのクラス間の an:m 関係を実現したい。学生はより多くのコースに参加し、コースはメンバーとしてより多くの学生で構成されます。各サイトから両方のリストを取得するために、バッグと多対多の双方向関連付けを行います。

2 つの Student クラスと Course クラス:

public class Student {         
     // Attributes........

     [XmlIgnore]
     public virtual IList MyCourses { get; set; }

     // Add Method
     public virtual void AddCourse(Course c)
    {
        if (MyCourses == null)
            MyCourses = new List<Course>();

        if (!MyCourses.Contains(c))
            MyCourses.Add(c);

        if (c.Members== null)
            c.Members= new List<Student>();

        if (!c.Members.Contains(this))
            c.Members.Add(this);
    }

    public virtual void RemoveCourse(Course c)
    {
        if (MyCourses != null)
            MyCourses.Remove(c);

        if (c.Members!= null)
            c.Members.Remove(this);
    }
}

public class Course {         
     // Attributes........

     [XmlIgnore]
     public virtual IList Members { get; set; }
}

データベースには、2 つのテーブル t_Student、t_Course、および関連テーブル tr_StudentCourse(id, student_id, course_id) があります。

<class name="Student" table="t_Student" polymorphism="explicit">
 ..... 
 <bag name="MyCourses" table="tr_StudentCourse">
   <key column="student_id" />
   <many-to-many class="Course" column="course_id" not-found="ignore" />
 </bag>    
</class>

<class name="Course" table="t_Course" polymorphism="explicit">
 ..... 
 <bag name="Members" table="tr_StudentCourse" inverse="true">
   <key column="course_id" />
   <many-to-many class="Student" column="student_id" not-found="ignore" />
 </bag>    
</class>

コースは、双方向の関連付けで逆に選択されました。nhibernate ドキュメントのセクション 6.8 の例 (カテゴリ、アイテム) と同じことを行いました。そのため、Add/Remove メソッドを呼び出してリスト MyCourses にコースを挿入した後、学生オブジェクトを保存しました。

Student st1 = new Student();
Course c1 = new Course();    
Course c2 = new Course();
st1.AddCourse(c1);
st1.AddCourse(c2);
session.saveOrUpdate(st1);

st1、c1、およびそれらの関係 (st1、c1) はデータベースで見つけることができます。リレーション データセットは (id= 1 , st1.id, c1.id) と (id= 2 , st1.id, c2.id) です。次に、オブジェクト st1 にさらにコースを追加します。

Course c3 = new Course();
st1.AddCourse(c3);
session.saveOrUpdate(st1);

3 つの関係データセットが表示されますが、2 つの古い関係が削除され、新しい 3 つの関係が別の新しい ID で作成されました。(id= 3 , st1.id, c1.id)、(id= 4 , st1.id, c2.id) および (id= 5 , st1.id, c3.id)。リレーション テーブルに id=1 と 2 以上のデータセットはありません。

Student.MyCourse からコースを削除してから学生オブジェクトを保存すると、同じことが削除されます。すべてのコレクションも削除され、削除された要素が 1 つ少ない新しいリストが再作成されました。この問題により、リレーション テーブルの ID が作成され、リレーションのバックアップが非常に高速になり、問題が発生します。

インターネット、ドキュメント、フォーラムを数日調べて、古いコレクション全体が削除され、変更ごとに新しいコレクションが作成された理由を調べましたが、成功しませんでした. これは nhibernate マッピングのバグですか、それとも何か間違ったことをしたのでしょうか?

あなたの助けと答えにとても感謝しています。

Nhibernate のドキュメントhttp://nhforge.org/doc/nh/en/index.htm

4

2 に答える 2

2

個々の行を識別するために使用できるキーがないため、NHibernate は行を個別に作成、削除、または更新することはできません。

「6.2. コレクションのマッピング」の注記による

すぐに、インデックス付きコレクションを使用idtr_StudentCourseてみることができます。つまり、置換または類似の要素をマッピングに追加<bag>します。<map><index>

<index
    column="id"
    type="int"
/>

で使用する関係テーブル用の特別なエンティティを作成することもできます<index-many-to-many>

于 2010-01-07T11:56:27.247 に答える