nHibernate,每个表的表和通过基类查询

时间:2015-03-04 11:09:24

标签: 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 {
}

当我尝试查询BaseClass以从数据库中检索所有子类的集合时,会出现问题。

var allInstances = dbSession.QueryOver<BaseClass>().List();

错误信息非常简单:&#34;无法实例化抽象类或接口&#34;。

所以我的问题是:有没有办法为我的场景设置一个查询,或者我必须为每个子类运行一个查询?

2 个答案:

答案 0 :(得分:0)

我不确定Nhibernate的QueryOver,但您可以使用Criteria进行多态查询。

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

您也可以尝试使用Linq

using NHibernate.Linq;

/// ...

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

答案 1 :(得分:0)

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

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

我最近遇到了这个问题,发现这是糟糕的数据。我有一个用于抽象基类的表和用于子类的20多个表(每个子类一个)。基类表有一条记录,在任何子类表中都没有匹配的记录。我猜测,当发生这种情况时,NHibernate决定被提取的对象必须是基类的一个实例(因为它无法在任何子类表中找到匹配的记录),并尝试实例化它在错误&#34;无法实例化抽象类或接口&#34;。

检查您的数据。