【发布时间】:2012-02-24 23:01:35
【问题描述】:
有几个消息来源指出 NHibernate 不能对每个具体类和联合子类的表使用标识。这是真的吗,这背后的确切原因是什么?
【问题讨论】:
标签: c# nhibernate nhibernate-mapping table-per-class union-subclass
有几个消息来源指出 NHibernate 不能对每个具体类和联合子类的表使用标识。这是真的吗,这背后的确切原因是什么?
【问题讨论】:
标签: c# nhibernate nhibernate-mapping table-per-class union-subclass
为什么这么说?我想我有几个这样的场景。这个blog entry 也是一样的。
总结以下cmets: 与 Ayende 的示例一样,如果您查询所有根类型(因此“选择方”),您可以获得 ID 的重复项。这一事实以及 UNION 特性(仅返回不同的记录)可能会给您带来意想不到的结果(丢失记录)。这就是为什么你不能使用身份,而是使用 hilo,它允许 nhibernate 避免重复。
【讨论】:
这很简单。 POID 在根实体类型的所有实例中必须是唯一的。
考虑以下示例:
abstract class Vehicle { ... }
class Car : Vehicle { ... }
class Truck : Vehicle { ... }
如果您要检索车辆您不知道具体类型:
var carOrTruck = session.Get<Vehicle>(vehicleId);
...同时存在具有该 ID 的 Car 和 Truck(这可能与身份有关),NHibernate 会返回哪一个? (有更复杂的情况,但这说明了一个可能的问题)
因此,对于 table-per-concrete-class(如果你问我,这是一个非常糟糕的策略),NHibernate 需要一个能保证子类之间唯一性的生成器。
【讨论】: