【问题标题】:Using Unmapped Class with NHibernate Named Query将未映射的类与 NHibernate 命名查询一起使用
【发布时间】:2010-10-14 05:36:30
【问题描述】:

我正在使用带有 NHibernate 的自定义命名查询,我想返回一个 Person 对象的集合。 Person 对象未使用 NHibernate 映射进行映射,这意味着我遇到了以下异常:

System.Collections.Generic.KeyNotFoundException: 给定的密​​钥不存在于 字典。

它在创建 Session 时被抛出,因为它在调用 NHibernate.Cfg.Mappings.GetClass(String className) 时找不到类名。这一切都是可以理解的,但我想知道是否有任何方法可以告诉 NHibernate 使用该类,即使我没有它的映射?

【问题讨论】:

    标签: c# nhibernate named-query


    【解决方案1】:

    如何创建一个返回未映射类型实例的查询?

    我认为 Michal 有一个观点,也许你应该看看预测。 (至少,这就是我认为您正在寻找的东西)。

    您在某个映射类型上创建查询,然后,您可以将该查询“投影”到“DTO”。 为此,您必须“导入”您的 Person 类,以便 NHibernate 知道它,并且您必须使用 ResultTransformer。

    类似这样的:

    ICriteria crit = session.CreateCriteria (typeof(Person));
    
    // set some filter criteria
    
    crit.SetProjection (Projections.ProjectionList()
                         .Add (Property("Name"), "Name")
                         .Add (Property( ... )
                       );
    
    crit.SetResultTransformer(Transformers.AliasToBean(typeof(PersonView));
    
    return crit.List<PersonView>();
    

    但是,这仍然意味着你必须 import 类,以便 NHibernate 知道它。

    【讨论】:

    • projections 并不是我想要的,但 TupleToPropertyResultTransformer 或 AliasToBean 转换器可以完成这项工作。我无权访问该类来给它一个新的构造函数来使用 AliasToBean 转换器,所以我使用的是 TupleToPropertyResultTransformer
    【解决方案2】:

    你为什么不使用:

    query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));

    它将使用列别名作为属性名称将查询中每一列的数据插入到 Person 对象属性中。

    【讨论】:

      【解决方案3】:

      为了解决这个问题,我最终使用了 TupleToPropertyResultTransformer 并提供了属性值列表。对此有一些限制,主要限制是 SQL 查询必须以与向 TupleToPropertyResultTransformer 构造函数提供属性相同的顺序返回结果。

      属性类型也是推断出来的,所以你需要小心十进制列只返回整数值等。除此之外,使用 TupleToPropertyResultTransformer 提供了一种相当简单的方法来使用 SQL 查询返回对象集合,而无需显式映射NHibernate 中的对象。

      【讨论】:

        【解决方案4】:

        如果没有很好的理由不映射类,只需添加映射即可获得最佳结果...

        也就是说,您不能使用命名查询将结果直接注入到未映射的类中。您需要告诉它哪些列放入哪些字段,或者换句话说,一个映射。 ;) 但是,您可以从命名查询返回标量值,并且可以获取这些对象数组并手动构建您的集合。

        【讨论】:

          【解决方案5】:

          通过使用该类,NHibernate 基本上会猜测所涉及的所有内容,包括您打算为 Person 使用哪个表,以及字段映射。 NHibernate 可能会被黑客入侵以基于匹配名称或其他内容进行动态绑定,但整个想法是使用 xml 文件创建从普通旧数据对象到数据库字段的映射。

          【讨论】:

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