2012-04-08 2 views
1

NHibernateの新機能です。子オブジェクトのリストを保存する際に問題が発生しています。NHibernateで保存されていない1対多のリスト

NOTE

<class name="Note" table="NOTE">   
    <id name="NoteID" column="NOTE_ID"> 
      <generator class="identity" /> 
    </id>   
    ...  
    <list name="Sections" table="NOTE_SECTIONS" cascade="all" lazy="false"> 
      <key column="NOTE_ID"/>    
      <index column="SORT_ORDER"/> 
      <one-to-many class="Section"/> 
    </list> 
</class> 

NOTEのSECTION

<class name="Section" table="NOTE_SECTIONS"> 
    <id name="SectionID" column="Section_ID"> 
      <generator class="identity" /> 
    </id>  
    <property name="NoteID" column="NOTE_ID"/> 
    ... 
</class> 

マッピングは、データを読み込むために完璧に動作します。私はNote Sectionに変更を加えるときしかし、それが生成するクエリは、適切な手順を経ているように見えるが、その後、私は次のエラーを取得する:

NHibernate.Exceptions.GenericADOException: could not delete collection: [Domain.Note.Sections#1][SQL: UPDATE NOTE_SECTIONS SET NOTE_ID = null, SORT_ORDER = null WHERE NOTE_ID = @p0] ---> System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'NOTE_ID', table 'NOTE_SECTIONS'; column does not allow nulls. UPDATE fails.

私はは次のように節約するために読んだことがこれは双方向である必要があります。しかし、私は読まれたことは、双方向のマッピングはリストでは機能しないということです。私のコレクションにはオーダーが維持されていることが重要です。保存する最良の方法は何ですか?

答えて

1

この方法で子オブジェクトを保存する場合は、コレクションマッピングでinverse="true"を使用する必要があります。まさにそれだった

<list name="Sections" table="NOTE_SECTIONS" inverse="true" cascade="all" lazy="false"> 
     <key column="NOTE_ID"/>    
     <index column="SORT_ORDER"/> 
     <one-to-many class="Section"/> 
</list> 

Inverse Attribute in NHibernate

+0

。したがって、双方向関係は必要ありません。私は時にはNHibernateがもっと明らかであることを望んでいました。 inverse = "true"は初心者のための最も直感的なコマンドではありません。 –

0

おそらく、ノートセクションの注釈は多対1の関係にする必要があります。

関連する問題