3

次の3つのテーブルの値の例を示します。

Vehicles ( id = 1, type_id = 20 , ... )
Vehicle_Types ( vt_id = 20, class_id = 160, ... )
Vehicle_Classes ( vcls_id = 160, name = "Concrete1" )

私が持っている

public class Concrete1 : Vehicle
{

}

そして、車両#1をロードするときにnhibernateがConcrete1をインスタンス化するようにしたい

Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);

自動マッピングでそれを行うにはどうすればよいですか?前もって感謝します。

編集1

これは不可能だと思い始めているので、回避策をいただければ幸いです。xml(流暢ではない)バージョンの手がかりは、どちらか非常に役立つかもしれません。

4

2 に答える 2

1

まず、悪いニュースです。

  • 識別子を別のテーブル、ピリオドに含めることはできません。ソースとして join を含む select ステートメントを使用することでこれを回避できますtableが、エンティティは事実上読み取り専用になります。または、機能するビューを使用できますが、より多くの作業を DB に委任します。
  • 正しいマッピングを使用してもsession.load<Vehicle>(1)、派生型を返すことはありません (ただし、遅延読み込みを無効にしている場合や、具体的なインスタンスがセッションで既に読み込まれている場合は除きます)。このハックで具体的なインスタンスを取得できます。

Vehicle has-a Typeこれで、データ モデルはリレーションシップよりもリレーションシップを使用した方が適切に機能するように見えます<ConcreteVehicle> is-a Vehicle

これにより柔軟性が高まり (たとえば、車両のタイプを変更できます)、戦略パターンを使用してポリモーフィズム機能を維持できます (車両タイプには動作が含まれます)。

于 2012-02-28T15:25:11.203 に答える
0

nhibernate.info ブログのこの投稿は、あなたが探していることを実行すると思います。

http://nhibernate.info/blog/2011/02/16/get-load-polymorphism-in-nhibernate-3.html

そうでなければ、それはあなたにアイデアを与えるかもしれません。

于 2012-02-28T13:42:50.473 に答える