NHibernate 是不是支持使用复合 ID 将抽象类映射到不同的表?

Posted

技术标签:

【中文标题】NHibernate 是不是支持使用复合 ID 将抽象类映射到不同的表?【英文标题】:Does NHibernate support mapping an abstract class to disparate tables using composite ids?NHibernate 是否支持使用复合 ID 将抽象类映射到不同的表? 【发布时间】:2009-08-04 22:37:07 【问题描述】:

我为特定项目提供了一个复杂的 3NF 数据库。我想避免使用每表类域设计。相反,我想从概念业务的角度对我的领域对象进行建模。

问题在于如何正确保存这些信息。我知道我可以走 ADO 路线,但我想尝试使用 NHibernate,因为它已成功用于其他具有更灵活数据存储的项目。

所以,我需要知道 NHibernate 是否支持以下场景:

我有一个称为 ProjectStatus 的概念对象,它由一些用于各种活动的日期戳以及一些关于状态的注释组成。构成 ProjectStatus 的所有数据都来自 2 个或更多表。没有 ProjectStatus 表。

我知道我可以在我的 NH 映射中做一个联合子类来让它工作,但是......

其中一个包含我需要的大量信息的表有一个复合 ID(两个 PK 字段共同构成身份签名)。我知道 NH 也支持复合 ID,但是我将如何将联合映射到复合键上?我是否需要在 union-subclass 部分下指定复合键?

dba 拒绝在她近乎神经质的 3NF 数据模型上让步,所以我被困在这方面。如果我必须放弃 ADO 以简化/加快开发速度,那就这样吧,但我希望 NH 能够超越...

【问题讨论】:

【参考方案1】:

我了解到您有一个基类和两个子类,您希望使用 table-per-concrete-class 映射策略将它们映射到两个子类表。两个子类表需要声明相同的主键,并且主键需要在基类映射中进行映射。您必须在基类映射中声明idcomposite-id,以便您可以向NHibernate 请求具有给定ID 或复合ID 的基类类型的对象。你不能在子类映射中声明它们,你当然不能声明它们对于每个子类类型都是不同的(这就是在子类映射中声明它们允许你做的事情),因为从一个强*类型面向对象的观点,那将离开理智的领域。

*对我来说,强类型意味着变量是静态类型的(每个变量的类型是已知的并由编译器强制执行)并且对象是严格类型的(每个对象的类型是已知的并由运行时强制执行)。

【讨论】:

Hrmmm... 不完全是我的目标,但绝对让我远离 NHibernate 来完成这个特定的项目。希望 dba 更灵活,但是唉...感谢您的意见。 您也可以查看<any> 映射,这可能对您有所帮助。您可以使用它来定义具有公共属性的基类,但您根本不定义基类映射,仅定义两个独立且不同的子类映射。缺点是您将无法在 Session 中查询基类类型的对象,只能查询子类类型的对象。

以上是关于NHibernate 是不是支持使用复合 ID 将抽象类映射到不同的表?的主要内容,如果未能解决你的问题,请参考以下文章

Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键

如何通过代码将 Id 映射到 NHibernate 映射中的私有支持字段?

如何在 Fluent NHibernate 中将一对一关系映射为复合键的一部分

无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键

NHibernate 复合键

Nhibernate一对多关系复合键问题