在Fluent NHibernate中处理与值类型的一对多关系

我正在努力将应用程序迁移到NHibernate,我正在使用Fluent NHibernate。 我遇到了一个将值类型集合映射到聚合根的问题。

我有一个PhoneNumber值类型,它具有一些属性 – NumberNumberTypeDescription 。 我的域中有许多对象都有电话号码集合。

在数据库(SQL 2008)中,这些值保存在不同的表中。 所以我可能有CustomersCustomerPhoneNumbers以及VendorsVendorPhoneNumbers 。 电话号码表是相同的,除了将它们与父母相关联的外键。

问题是我想使用一个简单的PhoneNumber值类型,而不必创建具有将它们与其父类型相关联的属性的CustomerPhoneNumberVendorPhoneNumber类型,我不知道如何在NHibernate中实现它。 这是可能的还是我需要更改我的域对象以更紧密地匹配底层数据库架构?

更新:更多信息
看起来我甚至无法将基本地图用于检索。 这是我所拥有的简化示例:

 public class CustomerMap : ClassMap { public CustomerMap() { Table("Customers"); Id(x => x.Id); Map(x => x.Name); Component(x => x.Address); HasMany(x => x.PhoneNumbers) .KeyColumn("CustomerId") .Cascade.All() .Table("CustomerPhoneNumbers"); } } public class PhoneNumberMap : ClassMap { public PhoneNumberMap() { Id(x => x.Id); Map(x => x.Number, "PhoneNumber"); Map(x => x.PhoneNumberType); Map(x => x.Description); } } 

看起来SQL没有正确生成。 当我尝试查看客户的PhoneNumbers列表时,我收到一个ADO错误,显示NHibernate正在寻找名为PhoneNumber的表。

看起来它没有拿起Table("CustomerPhoneNumbers")部分,并默认为一个与对象名称相同的表。 然而,我不能在PhoneNumberMap中指定一个表,因为它将根据我们正在提取的聚合根而不同。

您可以使用entity-name映射属性将单个对象PhoneNumber映射到多个表。 对不起,没有示例代码 – 我不使用Fluent,所以我无法帮助解决这个问题。 我可以发布样本hbm映射,如果这会有帮助的话。

实体名称基本上全面替换了类名。 当您使用实体名称时,您还必须修改会话以接受参数,以便在通过会话处理对象时指定实体名称。

文档在这里:

http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname

编辑添加了hbm样本。

这会将单个对象PhoneNumber映射到多个表

               

然后,例如,在PhoneNumber上调用更新,您将会话语法修改为以下内容,以便nhibernate知道要使用哪个表:

 _session.Update("PhoneNumberCustomer", myCustomerNumber) 

你必须弄清楚Fluent是否支持这个,如果是这样的话怎么做。 如果不是,您可以始终将hbm文件用于PhoneNumber对象。