繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM