【问题标题】:nHibernate, table-per-class and querying via base classnHibernate,每类表和通过基类查询
【发布时间】:2015-05-05 08:26:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# nhibernate table-per-class


    【解决方案1】:

    我不确定 Nhibernate 的 QueryOver,但您可以使用 Criteria 进行多态查询。

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

    您也可以尝试使用Linq

    using NHibernate.Linq;
    
    /// ...
    
    var result = dbSession.Query<BaseClass>()
                          .List();
    

    【讨论】:

    • 我已按照您的建议通过 Criteria 进行了尝试,但结果相同...
    • 你能发布你的映射类吗?
    【解决方案2】:

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

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

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

    检查您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多