代码之家  ›  专栏  ›  技术社区  ›  Iain Holder

NHibernate映射-一对一(或一对零)

  •  7
  • Iain Holder  · 技术社区  · 16 年前

    我有一个表[dbo].[Wibble]和另一个表[dbo].[WibbleExtended]。

    [Wibble]是主表,[WibbleExtended]是存储其他字段的可选表。[WibbleExtended]表中的条目远少于主[Wibble]表。我认为这在当时是为了解决一些空间问题(Wibble有很多行,wibblextended有很多列)。

    [dbo].[Wibble].[WibbleId]
    

    [dbo].[WibbleExtended].[WibbleId]
    

    是相同的,这是两个表之间的关系。

    注意,我无法更改模式。我正在把它移植到一个我几乎无法控制的遗留系统上。

    我当前的映射是:

    <class name="Wibble" table="Wibble" >
       <id name="Id" column="WibbleId" type="Int32">
          <generator class="assigned"/>
       </id>
    
       <many-to-one name="WibbleExtended" class="WibbleExtended" column="WibbleId" not-null="false" cascade="all"/>
    </class>
    

    <class name="WibbleExtended" table="WibbleExtended" >
       <id name="Id" column="WibbleId" type="Int32">
            <generator class="assigned" />
       </id>
    
       <many-to-one name="Wibble" class="Wibble" column="WibbleId" not-null="true" />     
     </class>
    

    问题是我遇到了一些错误,比如

    System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.
    

    我环顾四周,这看起来确实是一个正确的策略,它只是在最后的关口下降。

    免费的肉馅饼可以得到正确的答案。

    编辑:好的,下面是我通过@James Gregory解决这个问题的方法。

    1. 将单元测试从WibbleExtendedTests移动到WibbleTest类,并进行了必要的修改。

    2. 将以下内容添加到Wibble.hbm.xml

      <join table="WibbleExtended" optional="true">
           <key column="WibbleId"/>
           <property name="Blah1" column="Blah1" type="String" length="2000" not-null="false" />
           <property name="Blah2" column="Blah2" type="String" length="1000" not-null="false" />    
      </join>
      
    3. 向Wibble POCO添加了相应的属性。

    4. 已删除与WibbleExtended相关的所有代码。

    5. 运行测试,全部通过,签入。建造通过。去喝圣诞啤酒了(所以我更新这个之前已经过了几天了!:-)

    3 回复  |  直到 16 年前
        1
  •  11
  •   Jalal El-Shaer    16 年前

    您得到的错误是:

    此文件的索引n无效

    映射到同一列的两个属性 . 使用insert=false和 更新=两个选项中的一个为false。

    http://groups.google.com/group/nhusers/browse_thread/thread/84830b1257efd219

        2
  •  8
  •   tronda Bahribayli    9 年前

    你有没有考虑过使用 Join element 是在NHibernate2.0中引入的吗?此元素允许您连接多个表以形成一个实体;这种关系也可以是可选的。

        3
  •  1
  •   xhafan    13 年前

    http://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

    特别是“连接子类”映射,我认为您会发现它很有用(假设WibbleExtended继承自Wibble)。