NHibernate查询基类没有左连接到派生类

时间:2009-11-03 11:46:43

标签: c# nhibernate nhibernate-mapping

我有两个类,其中一个继承自另一个类。我试图使用NHibernate映射这些类,以便我可以尽可能高效地查询。 基类是抽象,需要能够自己查询。基类看起来像这样。

public class Cat
{
    public int Id { get; set; }
    public string Name { get; set; }
}

派生类看起来像这样:

public class CustomerCat : Cat
{
    public int CustomerId { get; set; }
}

派生的简单扩展了基础并为其添加了更多属性。我的映射文件看起来像这样

<?xml version="1.0" encoding="utf-8" ?>  
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"  
                   assembly="Foo"  
                   namespace="Foo">  
  <class name="Cat" table="Cat">  
    <id name="Id" column="CatId" type="Int32" unsaved-value="0">  
      <generator class="native" />  
    </id>  
    <property name="Name" column="CatName" type="string" />  
    <joined-subclass name="CustomerCat" table="CustomerCat">  
      <key column="CatId" />  
      <property name="CustomerId " column="CustomerId" />  
    </joined-subclass>  
  </class>  
</hibernate-mapping>

我遇到的问题是,如果我通过类似的东西查询Cats:

IList<Cat> cats = session.CreateCriteria<Cat>().List<Cat>();

生成的sql将通过join-subclass表保持连接。我可以查询我的基类而不参考查询中的任何派生类的表吗?

1 个答案:

答案 0 :(得分:2)

我认为为了以你想要的方式工作(即,并不总是做左连接),你必须创建一个抽象基类。问题是所有的CustomerCats都是Cats,因此它必须加入到该表中以获取所有Cats(即Cats和CustomerCats)。

如果您决定创建一个抽象基类,请参阅here以获取不同选项的概述以及它们产生的SQL。