queryover中的NHibernate视图返回重复记录

时间:2012-05-21 18:58:19

标签: nhibernate fluent-nhibernate

我似乎遇到了一个我用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映射或我的流畅映射。

1 个答案:

答案 0 :(得分:6)

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

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

  

隐式多态意味着类的实例将是   由命名任何超类或已实现接口的查询返回   或类和该类的任何子类的实例   由命名类本身的查询返回。显式多态性   表示只返回类实例的查询   显式地命名该类以及该类命名的查询   仅返回映射到此<class>内的子类的实例   声明为<subclass><joined-subclass>。对于大多数目的   默认值polymorphism="implicit"是合适的。明确的   当两个不同的类映射到时,多态性很有用   相同的表(这允许包含子集的“轻量级”类   的表格列。)

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