3

我有以下 3 个表的示例值

Vehicles ( id = 1, type_id = 20 , ... )
Vehicle_Types ( vt_id = 20, class_id = 160, ... )
Vehicle_Classes ( vcls_id = 160, name = "Concrete1" )

我有

public class Concrete1 : Vehicle
{

}

我希望 nhibernate 在装载车辆 #1 时实例化一个 Concrete1

Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);

我怎么能用自动映射做到这一点?提前致谢。

编辑1

我开始认为这是不可能的,因此任何解决方法都会受到赞赏。xml(非流利)版本的任何线索也可能有很大帮助。

4

2 回答 2

1

好的,首先,坏消息。

  • 您不能将鉴别器放在单独的表中,句号。您可以通过使用带有 join 作为 source 的 select 语句来解决这个问题table,但是您的实体实际上是只读的。或者您可以使用一个可以工作的视图,但将更多工作委托给数据库。
  • 即使使用正确的映射,session.load<Vehicle>(1)也永远不会返回派生类型(除非您禁用延迟加载,这是一个坏主意,或者如果具体实例已经在会话中加载)。您可以使用此 hack获取具体实例。

现在,您的数据模型看起来Vehicle has-a Type比关系更适用于关系<ConcreteVehicle> is-a Vehicle

这为您提供了更大的灵活性(例如,您可以更改车辆的类型),并且您可以通过使用策略模式(车辆类型包含行为)来保持多态性特征。

于 2012-02-28T15:25:11.203 回答
0

我认为 nhibernate.info 博客上的这篇文章可以满足您的需求。

http://nhibernate.info/blog/2011/02/16/get-load-polymorphism-in-nhibernate-3.html

如果没有,它可能会给你一个想法。

于 2012-02-28T13:42:50.473 回答