NHibernate 不得不求助于查询这个怪物,因为它不确切知道哪个表包含所需的数据。例如,使用 时session.Get<Vehicle>(100)
,NHibernate 不知道哪个表包含 ID 为 100 的车辆的数据,因此它必须将 Vehicle、Car、Truck、Bicycle 连接在一起。但是使用session.Get<Truck>
(100),NHibernate 知道数据只能驻留在 Truck 表中,因此查询会更加高效,只有一个连接:Vehicle 和 Truck。
因此,如果您无法更改数据库架构,那么我认为您只有一个选择,即在查询时尝试尽可能具体,始终为 NHibernate 提供您需要的确切类型的实体。
如果您可以更改架构,那么我认为您应该尝试简化模型类,避免使用如此大的继承树。NHibernate 提供了许多其他选项来将类连接在一起。
另一种选择是使用一对一而不是加入子类将一个域模型类的信息分成多个类,而不强制它们相互继承。我在使用更小的继承树时遇到了同样的问题(150 个类中大约有 20 个类共享同一个基类,并使用连接子类进行映射)。当家庭达到 20 人时,如果可能的话,我将停止在层次结构中添加更多类,并尝试使用一对一。