我正在致力于将应用程序迁移到 NHibernate,并且我正在使用 Fluent NHibernate。我遇到了将值类型集合映射到聚合根的问题。
我有一个PhoneNumber
具有一些属性的值类型 -Number
, NumberType
, and Description
。我的域中有许多对象包含电话号码的集合。
在数据库 (SQL 2008) 中,这些值保存在不同的表中。所以我可能有Customers
and CustomerPhoneNumbers
也Vendors
and VendorPhoneNumbers
。除了将它们与其父级相关联的外键之外,电话号码表是相同的。
问题是我想用一个简单的PhoneNumber
无需创建值类型CustomerPhoneNumber
and VendorPhoneNumber
类型具有将它们与其父类型相关联的属性,但我不知道如何在 NHibernate 中实现这一点。这是可能的还是我需要更改我的域对象以更紧密地匹配底层数据库架构?
更新:更多信息
看来我什至无法让基本地图用于检索。这是我所拥有的一个简化示例:
public class CustomerMap : ClassMap<Customer>
{
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<PhoneNumber>
{
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 中指定表,因为它会根据我们要提取的聚合根而有所不同。