为什么NHibernate不能在union-subclass表中使用Identity每个Concrete Class映射?

时间:2012-02-02 09:24:24

标签: c# nhibernate nhibernate-mapping table-per-class union-subclass

有几个消息来源声明NHibernate不能使用每个具体类和union-subclasses的表。这是真的,这背后的确切原因是什么?

2 个答案:

答案 0 :(得分:4)

这很简单。 POID在根实体类型的所有实例中必须是唯一的。

考虑以下示例:

abstract class Vehicle { ... }
class Car : Vehicle { ... }
class Truck : Vehicle { ... }

如果你要检索一个你不知道的具体类型的车辆

var carOrTruck = session.Get<Vehicle>(vehicleId);

......还有一辆Car和一辆带有Id的卡车(有可能带有身份),NHibernate将返回哪一辆? (有更复杂的案例,但这说明了一个可能的问题)

因此,对于table-per-concrete-class(如果你问我,这是一个非常糟糕的策略),NHibernate需要一个保证子类间唯一性的生成器。

答案 1 :(得分:1)

为什么这么说?我想我有几个这样的场景。此blog entry也表示相同。

总结下面的评论: 如Ayende所示,如果您查询所有根类型(所以“选择方”),您可以获得ID的重复项。这个事实与UNION特征(仅返回不同的记录)可能会给你意想不到的结果(缺少记录)。这就是为什么你不能使用身份而是hilo,它允许nhibernate避免重复。

相关问题