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

2024-01-09

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

我有一个PhoneNumber具有一些属性的值类型 -Number, NumberType, and Description。我的域中有许多对象包含电话号码的集合。

在数据库 (SQL 2008) 中,这些值保存在不同的表中。所以我可能有Customers and CustomerPhoneNumbersVendors 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 中指定表,因为它会根据我们要提取的聚合根而有所不同。


您可以使用实体名称映射属性将单个对象 PhoneNumber 映射到多个表。抱歉,没有示例代码 - 我不使用 Fluent,所以我无法在这方面提供帮助。如果有帮助的话,我可以发布示例 hbm 映射。

实体名称基本上全面取代了类名称。当您使用实体名称时,每当您通过会话使用对象时,您还必须修改会话以接受参数来指定实体名称。

文档在这里:

http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname 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 的更新,您可以将会话语法修改为以下内容,以便 nhibernate 知道要使用哪个表:

_session.Update("PhoneNumberCustomer", myCustomerNumber) 

你必须弄清楚 Fluent 是否支持这一点,如果支持的话该怎么做。如果没有,您始终可以使用 hbm 文件作为 PhoneNumber 对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐