Mapear vários valores para um objeto de valor em NHibernate
-
03-07-2019 - |
Pergunta
Eu sou bastante novo para NHibernate e embora eu estou achando toneladas de informações sobre o mapeamento NHibernate na web, eu sou muito bobo para encontrar este pedaço de informação.
Assim, o problema é que eu tenho o seguinte modelo:
é assim que eu gostaria que ele procure. Uma pessoa limpa, que tem duas propriedades endereço.
No banco de dados que eu gostaria de persistir isso em uma tabela. Assim, a linha Pessoa teria uma ShippingStreetname e uma coluna da rua, aquele mapeado para ShippingAddress.Streetname e outro para Address.StreetName
Eu encontrei um artigo sobre interfaces fluentes , mas ainda não descobriu como fazer isso através do XML de configuração.
Agradecemos antecipadamente!
Update: Eu encontrei a solução para este sozinho. Isto pode ser feito através do nó e trabalha bastante simples.
Para obter o mapeamento de endereço e ShippingAddress Eu apenas tive que adicionar o seguinte para o
<component name="Address" class="Address">
<property name="Streetname"></property>
<property name="Zip"></property>
<property name="City"></property>
<property name="Country"></property>
</component>
<component name="ShippingAddress" class="Address">
<property name="Streetname" column="ShippingStreetname" />
<property name="Zip" column="ShippingZip" />
<property name="City" column="ShippingCity" />
<property name="Country" column="ShippingCountry" />
</component>
Solução
Ok. Eu encontrei a solução mim. A chave é a construção na configuração XML e funciona bastante bem.
Aqui está como isso é feito:
<component name="Address" class="Address">
<property name="Streetname"></property>
<property name="Zip"></property>
<property name="City"></property>
<property name="Country"></property>
</component>
<component name="ShippingAddress" class="Address">
<property name="Streetname" column="ShippingStreetname" />
<property name="Zip" column="ShippingZip" />
<property name="City" column="ShippingCity" />
<property name="Country" column="ShippingCountry" />
</component>
Outras dicas
Você pode configurar isso como duas relações. por exemplo.
<many-to-one name="ShippingAddress" class="Yournamespace.Address"/>
<many-to-one name="Address" class="Yournamespace.Address"/>
Você não precisa mesmo de um ID para um endereço. Basta pensar o quão caro é manter uma Id. Você tem problemas de concorrência, você precisa de singularidade, e assim por diante. Este é o objetivo dos ValueObjects (não se confunde com System.ValueObject ver definição DDD para ValueObject). Neste caso Address é um ValueObject para que ele não exigiu uma Id. E se você precisa de uma coleção de endereço você mapeá-lo como um "" ver http://www.nhforge.org/doc/nh/en/index.html#collections-ofvalues ??.