【问题标题】:One-to-Many List Not Being Saved with NHibernateNHibernate 未保存一对多列表
【发布时间】:2012-04-10 09:38:53
【问题描述】:

我是 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:更新 NOTE_SECTIONS SET NOTE_ID = null,SORT_ORDER = null WHERE NOTE_ID = @p0] ---> System.Data。 SqlClient.SqlException:无法将值 NULL 插入列“NOTE_ID”、表“NOTE_SECTIONS”;列不允许空值。更新失败。

已经读到过,为了像这样保存,它需要是双向的。但我也读过双向映射不适用于列表。我的收藏品保持有序很重要 - 最好的保存方式是什么?

【问题讨论】:

    标签: nhibernate


    【解决方案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

    【讨论】:

    • 就是这样。因此,不需要双向关系。我有时希望 NHibernate 更明显一点。 inverse="true" 对初学者来说并不是最直观的命令。
    【解决方案2】:

    您可能需要将 Note Section 中的 Note 称为多对一关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多