NHibernate de mise en correspondance un-à-un (ou zéro)

NHibernatians!

J'ai une table [dbo].[Wibble] et une autre table [dbo].[WibbleExtended].

[Wibble] est la table principale et [WibbleExtended] est une option de la table où certains autres champs sont stockés. Il y a beaucoup moins d'entrées dans le [WibbleExtended] table que la principale [Wibble] table. Je pense que cela a été fait retour dans la journée à guérir certains problèmes d'espace (Wibble a de nombreuses lignes et WibbleExtened a beaucoup de colonnes).

L'ID de chaque tableau est le même et provient d'une source externe.

I. e.

[dbo].[Wibble].[WibbleId]

et

[dbo].[WibbleExtended].[WibbleId]

sont identiques et comment les deux tableaux se rapportent.

N. B. je ne peux pas modifier le schéma. Je suis de la chaussure horning ce sur un système d'héritage que je n'ai presque aucun contrôle sur.

Recherche autour il semble que l'un-à-un les mappages sont problématiques et la vigueur de la sagesse consiste à utiliser deux plusieurs-à-un les mappages.

Mon mappages actuellement sont:

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

Et

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

Le problème avec ceci est que j'ai des erreurs comme

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

J'ai regardé autour et ce ne ressembler à la bonne stratégie, c'est juste de la chute à la dernière haie.

Est le problème de l'id du générateur? Autre aspect de la cartographie?

Gratuit mince tarte pour la réponse correcte.

EDIT: Ok - voici ce que j'ai fait pour résoudre ce via @James Gregory.

  1. Déplacé l'appareil de tests à partir de la WibbleExtended les tests à la Wibble de la classe de test et faites les modifications nécessaires.
  2. Ajouté ce qui suit à l'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. Ajouté les propriétés correspondantes à la Wibble POCO.
  4. Supprimé tous les code relatives à la WibbleExtended.
  5. L'exécution des tests, tous les passés, en soute. Construire passé. Est allé pour un noël à la bière (donc il a été une couple de jours avant j'ai mis à jour ce! :-))
Ravi de voir un Wibble dans un exemple.

OriginalL'auteur Iain Holder | 2008-12-23