![](/img/trans.png)
[英]Nhibernate: Pull back most derived type in "Table-per-class hierarchy"
[英]nHibernate, table-per-class and querying via base 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();
错误消息非常简单:“无法实例化抽象类或接口”。
所以我的问题是:有没有办法为我的场景设置一个查询,或者我必须为每个子类运行一个查询?
我不确定Nhibernate的QueryOver
,但你可以使用Criteria
进行多态查询。
var result = dbSession.CreateCriteria<BaseClass>()
.List<BaseClass>();
您也可以尝试使用Linq
using NHibernate.Linq;
/// ...
var result = dbSession.Query<BaseClass>()
.List();
Nhibernate支持在一个查询中获取层次结构中不同类型的多个对象的功能。 这可以使用任何支持的查询(Queryover,HQL,ICriteria)来完成。
拥有映射会很有帮助,因为它会让我们知道表结构是什么。
我最近遇到了这个问题,发现这是糟糕的数据。 我有一个用于抽象基类的表和用于子类的20多个表(每个子类一个)。 基类表有一条记录,在任何子类表中都没有匹配的记录。 我猜测,当发生这种情况时,NHibernate决定被提取的对象必须是基类的实例(因为它无法在任何子类表中找到匹配的记录),并尝试实例化它,从而导致错误“无法实例化抽象类或接口“。
检查您的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.