我正在努力将应用程序迁移到 NHibernate,并且我正在使用 Fluent NHibernate。我遇到了将值类型集合映射到聚合根的问题。
我有一个 PhoneNumber
值类型,它具有一些属性 — Number
、NumberType
和 Description
。我的域中有许多包含电话号码集合的对象。
在数据库 (SQL 2008) 中,这些值保存在不同的表中。所以我可能有 Customers
和 CustomerPhoneNumbers
以及 Vendors
和 VendorPhoneNumbers
。除了将它们与其父级相关联的外键外,电话号码表是相同的。
问题是我想使用一个简单的 PhoneNumber
值类型,而不必创建具有以下属性的 CustomerPhoneNumber
和 VendorPhoneNumber
类型将它们与它们的父类型相关联,我不知道如何在 NHibernate 中完成它。这是可能的还是我需要更改我的域对象以更接近地匹配底层数据库架构?
更新:更多信息
看起来我什至无法让基本 map 用于检索。这是我所拥有的一个简化示例:
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 中指定一个表,因为它会有所不同,具体取决于我们要提取的聚合根。
最佳答案
您可以使用实体名称映射属性将单个对象 PhoneNumber 映射到多个表。抱歉,没有示例代码 - 我不使用 Fluent,所以我无法在这方面提供帮助。如果有帮助,我可以发布示例 hbm 映射。
实体名基本上全面取代了类名。当您使用实体名称时,您还必须修改您的 session 以接受一个参数,以便在您通过 session 处理对象时指定实体名称。
文档在这里:
http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname
编辑添加了 hbm 样本。
这将单个对象 PhoneNumber 映射到多个表
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DomainModel.PhoneNumber, DomainModel"
table="PhoneNumberVendors" entity-name="PhoneNumberVendor">
<id name="_id" access="field" column="PhoneNumberId">
<generator class="assigned"/>
</id>
<property name= "...">
</class>
<class name="DomainModel.PhoneNumber, DomainModel"
table="PhoneNumberCustomers" entity-name="PhoneNumberCustomer">
<id name="_id" access="field" column="PhoneNumberId">
<generator class="assigned"/>
</id>
<property name= "...">
</class>
</hibernate-mapping>
例如,为了调用 PhoneNumber 的更新,您将 session 语法修改为以下内容,以便 nhibernate 知道要使用哪个表:
_session.Update("PhoneNumberCustomer", myCustomerNumber)
您将不得不弄清楚 Fluent 是否支持此功能,如果支持如何操作。如果没有,您始终可以将 hbm 文件用于 PhoneNumber 对象。
关于c# - 在 Fluent NHibernate 中处理与值类型的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5450304/