将多个值映射到NHibernate中的值对象

将多个值映射到NHibernate中的值对象,nhibernate,orm,mapping,Nhibernate,Orm,Mapping,我是NHibernate的新手,虽然我在网上找到了大量关于NHibernate地图的信息,但我太傻了,找不到这条信息 问题是,我得到了以下模型: 这就是我想要的样子。一个干净的人,有两个地址属性 在数据库中,我希望将其保存在一个表中。 因此Person行将有一个ShippingStreetname和一个Streetname列,一个映射到ShippingAddress.Streetname,另一个映射到Address.Streetname 我找到了一个,但仍然没有弄清楚如何通过XML配置实现这一

我是NHibernate的新手,虽然我在网上找到了大量关于NHibernate地图的信息,但我太傻了,找不到这条信息

问题是,我得到了以下模型:

这就是我想要的样子。一个干净的人,有两个地址属性

在数据库中,我希望将其保存在一个表中。 因此Person行将有一个ShippingStreetname和一个Streetname列,一个映射到ShippingAddress.Streetname,另一个映射到Address.Streetname

我找到了一个,但仍然没有弄清楚如何通过XML配置实现这一点

提前谢谢

更新:我自己找到了解决办法。这可以通过节点完成,并且工作非常简单

为了实现地址和ShippingAddress的映射,我只需在

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

您可以将其配置为两个关系。e、 g

<many-to-one name="ShippingAddress" class="Yournamespace.Address"/>
<many-to-one name="Address" class="Yournamespace.Address"/>

好的。我自己找到了解决办法。 关键是XML配置中的构造,它工作得相当好

下面是如何做到的:

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


您甚至不需要地址Id。试想一下维护一个Id的代价有多大。您有并发性问题,您需要唯一性,等等。这是ValueObject的目标(不要与System.ValueObject混淆请参见ValueObject的DDD定义)。在本例中,地址是一个ValueObject,因此不需要Id。如果需要地址集合,请将其映射为“”请参阅

你能试着更精确一点怎么做吗?地址值对象没有id,它存储在同一数据库中。这就是为什么我不能使用简单的关系。一个ID永远不会伤害你,因为你不必使用它,但是nhibernate会感激你的!不能有Id,因为ShippingAddress和Address与Person位于同一个表中。它们是附加字段为什么不在数据库的对象空间中使用相同的模型?这将解决很多问题。两个外键,你的问题就会消失。顺便说一句,这会更干净。这代表了一种更规范化的方法。从Person表中删除重复数据(地址字段),并将其放入地址表并为其指定标识。例如,当您想要添加Company.AddressId和Company.ShippingAddressId时,这将使事情变得更简单。如果您将某个实体存储到数据库中,则应始终为其提供唯一的ID。这将使生活更轻松。然后,您可以创建一个Address对象(映射到数据库中与您的配置对应的Address表),并将其引用给您的customers Address和ShippingAddress属性。