如何为具有作为子类的每表类实体的类创建流畅的nh类映射?

时间:2011-05-11 21:41:37

标签: nhibernate fluent-nhibernate

我正在试图找出如何在流畅的nhibernate中替换使用类映射的自动化。这是我目前的情况:

我有实体“Foo”,实体“FooSubclassA”和“FooSubclassB”是其子类。没有鉴别器列,因为它们使用相同的id和SubclassMap。这很好;我可以检索FooSubclassA和FooSubclassB的列表,并查看使用“Foo”继承的属性。

我的问题是现在我有一个“Bar”类,它具有“Foo”的一对一属性。我希望Foo实例要么是FooSubclassA,要么是FooSubclassB,具体取决于它实际找到Foo_id的位置。我的问题是我似乎找不到通过类映射来定义它的方法。

我确实在“Bar”实体中有一个可用作鉴别器的字段,如果我需要这样做的话。 (Bar.IsFooSubclassA)

1 个答案:

答案 0 :(得分:1)

您是否在SubclassMappings中调用了KeyColumn("some_column_name");?这是获取每子类表映射所必需的。然后,从“Bar”到“Foo”的引用只是对多对一的简单References()调用或HasOne()一对一的调用。

以下内容可能不适用于您的问题,但我会将其写为完整性:

如果你的映射是正确的,你可能会得到一个正确的实体,但却看不到它。您应该知道延迟加载的多态多对一或一对一将始终是基类(“Foo”)的代理,因为当代理是NHibernate时,NHibernate无法知道子类是什么。创建。因此,您不能只使用“is”运算符(或类似)检查类型。

如果你没有使用延迟加载或在加载“Bar”时急切地获取关联,你应该得到一个“普通”“FooSubclassA”或“FooSubclassB”对象。

如果您需要延迟加载,可以在此处获得解决方法:http://sessionfactory.blogspot.com/2010/08/hacking-lazy-loaded-inheritance.html