3

NHibernate でマップしたデータベース ビューの 1 つで奇妙な問題が発生しているようです。マップしたビューの 1 つで重複したレコードを取得しています。次のビューオブジェクトがあります

                      WorkDetailView
                       /          \
                      /            \
                     /              \
                    /                \
          PickWorkDetailView    PutWorkDetailView

各オブジェクトはデータベース内の異なるビューを表しますが、多くの同じフィールドを共有しているため、PickWorkDetailViewPutWorkDetailViewから継承されます。WorkDetailView

次のコードを実行すると、2 つの結果が得られますが、SQL Management Studio で実際のデータベース ビューを実行すると、1 つの結果が得られます。

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

興味深い点は、workList上記のコレクションのすべてのアイテムを見ると、1 つのWorkDetailViewオブジェクトと 1 つのPickWorkDetailViewオブジェクトが表示されることです。また、NHibernate が実行しているクエリを見ると、3 つのビュー (WorkDetailView、PickWorkDetailView、および PutWorkDetailView) からの選択が発行されます。これはまったく正しく聞こえません。必要に応じて、xml マッピングまたは流暢なマッピングを投稿できます。

4

1 に答える 1

6

NHibernate は、ポリモーフィック クエリをサポートしています。したがって、その基本クラスを照会すると、そのクラスから派生したすべてのオブジェクトが検索されます。

この動作は、クラス マッピングのポリモーフィズム属性で制御できます。

暗黙的なポリモーフィズムとは、クラスのインスタンスがスーパークラスまたは実装されたインターフェイスまたはクラスを指定するクエリによって返され、クラスのサブクラスのインスタンスがクラス自体を指定するクエリによって返されることを意味します。明示的なポリモーフィズムとは、クラス インスタンスが返されるのは、そのクラスを明示的に指定したクエリのみであり、クラスを指定したクエリは、この<class> 宣言内で<subclass>またはとしてマップされたサブクラスのインスタンスのみを返すこと<joined-subclass>です。ほとんどの場合、デフォルトのpolymorphism="implicit"が適切です。明示的なポリモーフィズムは、2 つの異なるクラスが同じテーブルにマップされている場合に役立ちます (これにより、テーブル列のサブセットを含む「軽量」クラスが可能になります)。

あなたの例polymorphism="explicit"では、3 つのマッピングすべてを設定できます。

于 2012-05-23T20:20:06.923 に答える