Mapeamento do NHibernate - um para um (ou um para zero)

NHibernatians!

Eu tenho uma tabela [dbo]. [Wibble] e outra tabela [dbo]. [WibbleExtended].

[Wibble] é a tabela principal e [WibbleExtended] é uma tabela opcional em que outros campos são armazenados. Há muito menos entradas na tabela [WibbleExtended] do que na tabela principal [Wibble]. Acho que isso foi feito no passado para curar alguns problemas de espaço (o Wibble tem muitas linhas e o WibbleExtened tem muitas colunas).

O ID para cada tabela é o mesmo e vem de uma fonte externa.

I.e.

[dbo].[Wibble].[WibbleId]

e

[dbo].[WibbleExtended].[WibbleId]

são idênticos e é como as duas tabelas se relacionam.

N.B. Não posso mudar o esquema. Estou colocando isso em um sistema legado sobre o qual quase não tenho controle.

Pesquisando ao redor, parece que os mapeamentos um para um são problemáticos e a sabedoria predominante é usar dois mapeamentos muitos para um.

Meus mapeamentos atualmente são:

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

E

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

O problema é que estou recebendo erros como

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

Eu olhei em volta e isso parece a estratégia correta, está apenas caindo no obstáculo final.

O problema é o gerador de identificação? Outro aspecto do mapeamento?

Torta de carne moída grátis para a resposta correta.

EDIT: Ok - aqui está o que eu fiz para resolver isso via @ James Gregory.

Moveram os testes de unidade dos testes WibbleExtended para a classe de teste Wibble e fizeram as modificações necessárias.

Adicionado o seguinte ao arquivo 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>

Adicionadas as propriedades correspondentes ao WIBble POCO.

Excluiu todo o código relacionado ao WibbleExtended.

Execute testes, todos aprovados, com check-in. Compilação aprovada. Fui para uma cerveja de natal (daí a alguns dias que eu atualizei isso! :-))

questionAnswers(3)

yourAnswerToTheQuestion