2012-05-21 94 views
3

我似乎有一個奇怪的問題,我與我用NHibernate映射的數據庫視圖之一。我得到了我映射的其中一個視圖的重複記錄。我有以下看法對象在查詢中的NHibernate視圖返回重複記錄

     WorkDetailView 
        /  \ 
        /   \ 
        /   \ 
        /    \ 
      PickWorkDetailView PutWorkDetailView 

每個對象表示在數據庫中有不同的看法,但都PickWorkDetailViewWorkDetailViewPutWorkDetailView繼承,因爲它們共享許多相同的字段。

如果我運行下面這段代碼,我會得到2個結果,但是如果我在SQL Management Studio中運行實際的數據庫視圖,則會得到1個結果。

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

有趣的是,當我看workList集合中的所有上述項目我看到一個WorkDetailView對象和一個PickWorkDetailView對象。另外,如果我看NHibernate運行它的問題,請從所有3個視圖中選擇(WorkDetailView,PickWorkDetailView和PutWorkDetailView)。這聽起來不對。如果需要,我可以發佈xml映射或我的流利映射。

回答

5

NHibernate支持多態查詢。所以,當你查詢該基類時,它將查找從該類派生的所有對象。

您可以通過類映射上的polymorphism attribute來控制此行爲。

隱多態性指的類的實例將被 由查詢名稱任何超類或實現的接口 或類和類的任何亞類的實例返回將被 由查詢名稱返回班級本身。明確多態性 意味着類實例將只退還是 明確命名該類查詢和進行命名的類查詢將返回 只子類的實例映射這個<class> 聲明中爲<subclass><joined-subclass>。對於大多數目的 默認,polymorphism="implicit",是適當的。顯式 多態性在兩個不同的類映射到 相同表(這允許包含表列的子集 )的「輕量級」類時非常有用。

在您的示例中,您可以在所有3種映射中設置polymorphism="explicit"

+0

謝謝@dotjoe。這就是它。我很驚訝我錯過了NHibernate文檔中的那一個。對於那些使用Fluent NH的人來說,你只需要在你的ClassMap中使用下面的語句:'Polymorphism.Explicit();' –

+0

非常感謝你,這對我有很大的幫助。 – hikalkan

+0

只是我的案例所需的答案。非常感激。 –