获取对象时每个子类策略问题的nhibernate表

时间:2011-01-08 17:10:36

标签: nhibernate

我正在使用一个使用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实际实例化它返回的对象会使这个变得不可能吗?有可能吗?

我觉得我得到的信息超出了我的需要。

2 个答案:

答案 0 :(得分:2)

你永远不会得到抽象类,因为抽象类的重点是你无法实例化它。除此之外,您的代码只会将Document facade返回到代码的其余部分。所以我不确定问题究竟是什么。

答案 1 :(得分:0)

无法检索仅填充抽象类中定义的属性的Document1或Document2的实例。在.NET中,即使将类型声明为接口或抽象类,也始终使用具体类的实例。