我似乎遇到了一个我用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映射或我的流畅映射。
答案 0 :(得分:6)
NHibernate支持多态查询。因此,当您查询该基类时,它将查找从该类派生的所有对象。
您可以使用类映射上的polymorphism attribute来控制此行为。
隐式多态意味着类的实例将是 由命名任何超类或已实现接口的查询返回 或类和该类的任何子类的实例 由命名类本身的查询返回。显式多态性 表示只返回类实例的查询 显式地命名该类以及该类命名的查询 仅返回映射到此
<class>
内的子类的实例 声明为<subclass>
或<joined-subclass>
。对于大多数目的 默认值polymorphism="implicit"
是合适的。明确的 当两个不同的类映射到时,多态性很有用 相同的表(这允许包含子集的“轻量级”类 的表格列。)
在您的示例中,您可以在所有3个映射上设置polymorphism="explicit"
。