我正在使用一个使用NHibernate的ASP.NET Web应用程序,我发现了一些有趣的东西 所以我有一个对象文档,我将它作为一个抽象类和2个具体实现Document1和Document2。 我尝试使用文档(link text)中描述的每子类表策略为它们编写映射:
<class name="Document" abstract="true">
<id name="Id">
<generator class="identity"/>
</id>
...
<class>
<joined-subclass
name="Document1"
extends="Document" >
<key column="ParentId"/>
...
</joined-subclass>
<joined-subclass
name="Document2"
extends="Document" >
<key column="ParentId"/>
...
</joined-subclass>
现在,这就是我在应用程序中从会话中获取对象的方法:
public TEntity GetById<TEntity>(object id) {
return Session.Get<TEntity>(id);
}
现在我的问题是,当我这样做时:
GetById<Document>(1)
例如,我没有得到Document对象,我得到一个Document1或Document2类型的对象,具体取决于该对象的类型。
我尝试使用带有鉴别器策略的table-per-subclass,如文档中所述(上面的链接),我在抽象对象上设置join = select和lazy = false,以使其返回Document类型的对象但没有工作
代码有效,但似乎不对。我有一个左连接,我不能使用它。 难道没有办法只获取抽象对象或者nhibernate实际实例化它返回的对象会使这个变得不可能吗?有可能吗?
我觉得我得到的信息超出了我的需要。
答案 0 :(得分:2)
你永远不会得到抽象类,因为抽象类的重点是你无法实例化它。除此之外,您的代码只会将Document facade返回到代码的其余部分。所以我不确定问题究竟是什么。
答案 1 :(得分:0)
无法检索仅填充抽象类中定义的属性的Document1或Document2的实例。在.NET中,即使将类型声明为接口或抽象类,也始终使用具体类的实例。