質問

次の 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
{

}

そして、私はnhibernateに、車両#1を積み込むときにconcrete1をインスタンス化してもらいたい

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

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

編集1

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

役に立ちましたか?

解決

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

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

さて、あなたのデータモデルは、 Vehicle has-a Type 関係よりも <ConcreteVehicle> is-a Vehicle 1つ。

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

他のヒント

nhibernate.info ブログのこの投稿は、あなたがやりたいことをやっていると思います。

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

そうでない場合は、アイデアが得られるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top