7

これは、NHibernate での一方向の 1 対 1 マッピングの問題です。

Student.cs

public class Student
{
    public int ID { get; set; }
    public int Roll { get; set; }
    public int RegNo { get; set; }
    public string Name { get; set; }

    public StudentDetail StudentDetail { get; set; }
}

StudentDetail.cs

public class StudentDetail
{
    public int ID { get; set; }

    public string Father { get; set; }
    public string Mother { get; set; }
}

これらのクラス (hbm マッピング ファイルはどのように見えるか) を次のような 1 対 1 の関係にマップするにはどうすればよいですか?

代替テキスト

クラスとテーブルをよく見てください。

<many-to-one>または のどこにタグを付けることができますStudent.hbm.xmlStudentDetail.hbm.xml? に入れたら、別のテーブルにあるのでStudent.hbm.xml、どうすれば列をマッピングできますか?StudentDetail.StudentID

したがって、このマッピング:

<class name="Student" table="Student">
    <id name="ID" column="ID">
      <generator class="native"/>
    </id>

    .......

    <many-to-one class="StudentDetail" name="StudentDetail" column="StudentID" unique="true" cascade="all" />
  </class>

次の例外が生成されます。

{"Invalid column name 'StudentID'."}

一方、<many-to-one>には配置できませんStudentDetail.hbm.xml。タイプStudentDetail.csのプロパティは含まれていませんStudent

タグは使え<one-to-one>ますか?はいの場合、またはのどこに配置すればよいですStudent.csStudentDetail.cs?また、どのように構成すればよいですか?

4

2 に答える 2

5

ケース#1:

学生で...

<one-to-one name="StudentDetail" 
            cascade="save-update,delete" 
            property-ref="Student" />

StudentDetailで...

<many-to-one name="Student" 
             column="StudentID" 
             unique="true" 
             cascade="none" />

StudentDetailクラスには、Studentオブジェクト(Studentと呼ばれる)を参照するプロパティが必要であることに注意してください。また、カスケードは使用法によって異なる場合があります。ただし、おそらくそこに削除カスケードが必要です。

unique="true"、StudentDetail側での1対1のマッピングを保証します。

ケース#2:

2つのマッピングを交換するだけで、プロパティ名を反対のクラスに変更するようにしてください。

詳細については、こちらをご覧ください: http: //nhforge.org/blogs/nhibernate/archive/2009/04/19/nhibernate-mapping-lt-one-to-one-gt.aspx

于 2010-06-07T16:16:48.107 に答える
2

コレクション プロパティを非表示にし、最初の要素のみを公開して、1 対多としてマップできます。

public class Student
{
    public virtual int ID { get; set; }
    public virtual int Roll { get; set; }
    public virtual int RegNo { get; set; }
    public virtual string Name { get; set; }

    protected virtual IList<StudentDetail> StudentDetails { get; set; }

    public virtual StudentDetail StudentDetail
    {
        get
        {
            if (StudentDetails.Count == 0) return null;
            return StudentDetails[0];
        }
        set
        {
            if (StudentDetails.Count != 0) throw new Exception();
            StudentDetails.Add(value);
            value.Student = this;
        }
    }
}

これよりもセッターをうまく処理できます-ポイントは、1対多に複数の行を追加しないようにすることです。明らかに、これStudentDetailsはマップされていStudentDetailますが、.hbm.xml または Fluent マッピングにはありません。

于 2010-06-07T16:14:25.817 に答える