2009-05-21 10 views
0

私は単純なモデルクラス(Part)を持っています。これは、単一のテーブル(t_Part)からその情報を引き出します。NHibernate - 誤った考えですか?サブクラス化された結合モデル

(ProducedPart)というこのモデルのサブクラスは、まだNHibernateのキャッシュメカニズムを利用しますが、 "t_PartProduction"というテーブル内に外部キー関係を持つ(Part)のインスタンスに過ぎません。私はこの2番目のテーブルのモデルを持っている必要はありません。

私は、私はいつもこの上ファサード/リポジトリを実装することができますが、私はセットアップにする場合I「t_Partは」「PartProduction」と結合引き上げるマッピングを期待していたProducedPart

の読み取り専用バージョンを必要としますNHで "ProducedPart"を求めた

NHを使用する方法は間違っていますか?

編集

ので、SQLはありません、これは完全に可能である

SELECT p.* 
FROM t_Part p 
INNER JOIN t_PartProduction pp ON pp.PartID = p.PartID 
WHERE pp.ProductionYear = '2009' 
+0

、私はVIEWを作成し、それに対してマッピングするために流暢 - NHibernateはを使用していました。 –

答えて

1

ここでのキーは、NHibernateマッピングのclass定義のwheremutable要素の両方を使用しています。流暢NHibernateはを使用して

が、これは次のようになります。この問題のために最終的に

public Part() 
    { 
     WithTable("t_Part"); 

     Id(i => i.Id).ColumnName("PartID"); 
     Map(m => m.Name).ColumnName("Part"); 

     SetAttribute("where", "PartID IN (SELECT pp.PartID FROM t_PartProduction pp WHERE pp.ProductionYear = '2009') "); 

     ReadOnly(); 
    } 
1

ようになります。継承の "サブクラスごとのテーブル"モデルについてはNHibernateのドキュメントを参照してください。これは実際にはLEFT JOINとして実装されるため、Partをロードすると、PartまたはProducedPartクラスのインスタンスが作成され、他の行が存在するかどうかによって異なります。 nhibernate.infoに関するドキュメントがあります。

私はあなたがこれを行う読み取り専用のProducedPartを作ることができるとは確信していません。

私はこれからと仮定しています:

あなたが別の年のt_PartProductionのレコードがあった場合、あなたがしたい場合つまりこの部分は治療、生産年は2009年であるだけサブクラスをしたい
WHERE pp.ProductionYear = '2009' 

ProducedPartではなくプレーンなPartオブジェクトとして、データベース内にt_PartProductionのフィルタリングされたバージョンであるビュー定義を作成し、そのサブクラスをベース・テーブルではなくこのビューに結合することを検討できます。

+0

NHForgeのリンクをありがとう。 class要素の "WHERE"節はどうでしょうか? –

1

あなたが探しているのは、サブクラスが参加していると思います。 NHibernateのは、結果をキャッシュしている、あなたはサブクラスがマッピングされている必要があります(そして、あなたがそれをマッピングしていない場合は、あなたが得ることができないだろうために

public class PartMap : ClassMap<Part> 
{ 
    public PartMap() 
    { 
     Id(x => x.Id) 

     JoinedSubClass<ProducedPart>("PartID", sub => { 
      sub.Map(x => x.Name); 
      sub.Map(x => x.ProductionYear); 
     }); 
    } 
} 

:FNHでは、それは次のようになりますNHを最初にロードする)。

FNH groups threadからの文脈では、明示的に読み取り専用ではありません。私の意見では、物事を読み込み専用にすることはNHibernateが管理するための適切なものではありません。これは、データベースおよび接続(すなわち、アクセスされるテーブル/ビューに対するSELECT許可のみを有するデータベースへの接続の作成)により良好に制御される。問題についての私の考えの詳細については、NHibernateでのreadonlyセッションに関する先のSOの質問へのmy answerを参照してください。

+0

FNHにモデルを読み取り専用にするReadOnly()メソッドがありませんか? –

+0

はい、あなたが発見したとおり、それはmutable属性をfalseに設定します。これは、アプリケーションがデータベースに触れる唯一のアプリケーションである場合、またはデータを読み取り専用にするための強力な*必要性*がない場合には問題ありません。ただし、データベースへの完全な特権接続を使用している限り、どのコードでもその接続を使用してNHの速度バンプを実行し、必要なCRUDステートメントを実行できます。これは私が他の答えで得ていたものです。あなたのAPIの使い方を読んでお勧めしますが、必要がある場合は、適切なレベルで*適用する必要があります。 –

+0

ProducedPartは読み取り専用として、実際にはデータを見るための単なる構築物です。これは基本的に今年のProductionを持つPartのSQLビューを作成しています。これは私のプロジェクトにとって非常に便利なイディオムです。このモデルは基本的にバーチャルなので、私は確信して不変にしたいと思っていました。ありがとう! –

関連する問題