使用NHibernate保存一对多列表

时间:2012-04-08 22:15:59

标签: nhibernate

我是NHibernate的新手,我在保存子对象列表时遇到了问题。

注意

<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>

注意事项

<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:无法删除集合:[Domain.Note.Sections#1] [SQL:UPDATE NOTE_SECTIONS SET NOTE_ID = null,SORT_ORDER = null WHERE NOTE_ID = @ p0] ---&gt; System.Data.SqlClient.SqlException:无法将值NULL插入列'NOTE_ID',表'NOTE_SECTIONS';列不允许空值。更新失败。

读取,为了保存这样,它需要是双向的。但我也读到,bidrectional映射不适用于列表。重要的是我的收藏品有一个维护的订单 - 最好的保存方式是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

可能您需要将Note部分中的Note作为多对一关系引用。