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