从相关表中流利的nhibernate鉴别器

时间:2012-02-26 02:34:25

标签: c# nhibernate fluent-nhibernate automapping discriminator

我的以下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);

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

EDIT1

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

2 个答案:

答案 0 :(得分:1)

好的,首先是坏消息。

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

现在,您的数据模型似乎与Vehicle has-a Type关系比<ConcreteVehicle> is-a Vehicle关系效果更好。

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

答案 1 :(得分:0)

我认为nhibernate.info博客上的这篇文章可以帮助您实现目标。

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

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