【问题标题】:NHibernate View in queryover returns duplicate recordsqueryover 中的 NHibernate 视图返回重复记录
【发布时间】:2014-10-06 20:22:31
【问题描述】:

我使用 NHibernate 映射的一个数据库视图似乎有一个奇怪的问题。我正在为我映射的其中一个视图获取重复记录。我有以下视图对象

                      WorkDetailView
                       /          \
                      /            \
                     /              \
                    /                \
          PickWorkDetailView    PutWorkDetailView

每个对象代表数据库中的不同视图,但 PickWorkDetailViewPutWorkDetailView 都继承自 WorkDetailView,因为它们共享许多相同的字段。

如果我运行以下代码,我会得到 2 个结果,但如果我在 SQL Management Studio 中运行实际的数据库视图,我会得到 1 个结果。

List<WorkDetailView> workList = session.QueryOver<WorkDetailView>()
                                       .List<WorkDetailView>().ToList();

有趣的是,当我查看上面workList 集合中的所有项目时,我看到一个WorkDetailView 对象和一个PickWorkDetailView 对象。此外,如果我查看 NHibernate 正在运行的查询,它会从所有 3 个视图(WorkDetailView、PickWorkDetailView 和 PutWorkDetailView)中进行选择。这听起来根本不对。如果需要,我可以发布 xml 映射或我的 fluent 映射。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    NHibernate 支持多态查询。因此,当您查询该基类时,它将查找派生自该类的所有对象。

    您可以使用类映射上的polymorphism attribute 来控制此行为。

    隐式多态意味着类的实例将是 由命名任何超类或已实现接口的查询返回 或类,并且该类的任何子类的实例将是 由命名类本身的查询返回。显式多态性 意味着类实例将仅作为查询返回 显式命名该类,并且命名该类的查询将 仅返回映射在此 &lt;class&gt; 内的子类的实例 声明为&lt;subclass&gt;&lt;joined-subclass&gt;。大多数用途 默认值polymorphism="implicit" 是合适的。显式 当两个不同的类映射到 同一张表(这允许包含一个子集的“轻量级”类 表列)。

    在您的示例中,您可以在所有 3 个映射上设置 polymorphism="explicit"

    【讨论】:

    • 谢谢@dotjoe。这正是它。我很惊讶我错过了 NHibernate 文档中的那个。对于那些使用 Fluent NH 的人,您只需要在 ClassMap 中包含以下语句:Polymorphism.Explicit();
    • 非常感谢,帮了大忙。
    • 这也是我的案例所需的答案。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多