相关表格中的fluent nhibernate鉴别器

本文关键字:nhibernate 鉴别 fluent 表格 | 更新日期: 2023-09-27 18:26:00

我有以下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(非流利)版本的线索都可能有很大帮助。

相关表格中的fluent nhibernate鉴别器

好吧,首先是坏消息。

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

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

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

我认为nhibernate.info博客上的这篇文章符合你的要求。

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

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