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! :-))