3

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

                      WorkDetailView
                       /          \
                      /            \
                     /              \
                    /                \
          PickWorkDetailView    PutWorkDetailView

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

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

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

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

4

1 回答 1

6

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

您可以使用类映射上的多态属性来控制此行为。

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

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

于 2012-05-23T20:20:06.923 回答