4

一些消息来源指出,NHibernate 不能将标识与每个具体类和联合子类的表一起使用。这是真的吗,这背后的确切原因是什么?

4

2 回答 2

4

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

考虑以下示例:

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

如果您要检索您不知道具体类型的车辆:

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

...并且有具有该 ID 的汽车和卡车(这可能与身份),NHibernate 会返回哪一个?(有更复杂的情况,但这说明了一个可能的问题)

因此,对于每个具体类的表(如果你问我,这是一个非常糟糕的策略),NHibernate 需要一个保证跨子类唯一性的生成器。

于 2012-02-02T16:42:20.290 回答
1

你为什么这么说?我想我有几个这样的场景。此博客条目也有相同的说明。

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

于 2012-02-02T10:23:17.450 回答