我有一些类层次结构,由代码映射到几个表中。一个用于基本抽象类,每个具体类一个表。 类层次结构相对简单,如下所示:
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;。
所以我的问题是:有没有办法为我的场景设置一个查询,或者我必须为每个子类运行一个查询?
答案 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;。
检查您的数据。