C# nHibernate、每个类的表和通过基类的查询

C# nHibernate、每个类的表和通过基类的查询,c#,nhibernate,table-per-class,C#,Nhibernate,Table Per Class,我有一些类层次结构,由代码映射到几个表中。一个用于基本抽象类,每个具体类一个表。 类层次结构相对简单,如下所示: public abstract class BaseClass { // some common fields here } public class Subclass1 : BaseClass { } public class Subclass2 : BaseClass { } public class Subclass3 : BaseClass { } 当我试图查询基

我有一些类层次结构,由代码映射到几个表中。一个用于基本抽象类,每个具体类一个表。 类层次结构相对简单,如下所示:

public abstract class BaseClass {
  // some common fields here
}

public class Subclass1 : BaseClass {
}

public class Subclass2 : BaseClass {
}

public class Subclass3 : BaseClass {
}
当我试图查询基类以从数据库中检索所有子类的集合时,就会出现问题

var allInstances = dbSession.QueryOver<BaseClass>().List();
var allInstances=dbSession.QueryOver().List();
错误消息非常简单:“无法实例化抽象类或接口”


因此,我的问题是:有没有一种方法可以对我的场景进行一次查询,或者我必须对每个子类运行一次查询?

我不确定Nhibernate的
查询版本
,但是您可以使用
标准执行多态查询

var result = dbSession.CreateCriteria<BaseClass>()
                      .List<BaseClass>();

Nhibernate支持在一个查询中获取层次结构中不同类型的多个对象。这可以使用任何支持的查询(Queryover、HQL、ICriteria)来完成

有了映射会很有帮助,因为它会让我们知道表结构是什么

我最近有这个问题,发现它是坏数据。抽象基类只有一个表,子类有20多个表(每个子类一个)。基类表有一条记录,在任何子类表中都没有匹配的记录。我猜想,当这种情况发生时,NHibernate会决定要获取的对象必须是基类的实例(因为它在任何子类表中都找不到匹配的记录),并尝试实例化它,导致错误“无法实例化抽象类或接口”


检查您的数据。

我已经按照您建议的标准尝试过了,但结果是相同的异常……您可以发布您的映射类吗?
using NHibernate.Linq;

/// ...

var result = dbSession.Query<BaseClass>()
                      .List();