0

我有一些类层次结构,由代码映射到几个表中。一个用于基本抽象类,每个具体类一个表。类层次结构比较简单,像这样:

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();

错误信息很简单:“无法实例化抽象类或接口”。

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

4

2 回答 2

0

我不确定QueryOverNhibernate 的,但你可以使用Criteria.

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

您也可以尝试使用Linq

using NHibernate.Linq;

/// ...

var result = dbSession.Query<BaseClass>()
                      .List();
于 2015-03-04T12:40:02.263 回答
0

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

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

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

检查您的数据。

于 2015-08-12T11:58:42.837 回答