2017-01-23 4 views
2

私は、テーブル「セル」、テーブル「分割」、およびそれらの間のテーブルを結合すると仮定します。 さらに、マップする必要のある「CellsView」(現在のユーザー権限に依存するセルを表示することができる)があるため、テーブル「セル」をマップできません。Fluent NHibernate - 依存関係のいずれかが存在しない場合、エンティティを返しません。

次のような状況があります。 1つのセルに割り当てられていますが、現在のユーザは、そのセルをリストしたい場合は表示されません。 Divisionのリストを取得している間、ユーザーはID「1」のCellが存在しないことを示す例外を取得します。

ディビジョンリストが例外をスローしないようにするにはどうすればいいですか(レイジーローディングが有効です)**そしてその例外をスローするディビジョンを表示するにはどうすればいいですか* *?

OnPreLoadイベントとOnPostLoadイベントで現在のエンティティをnullにしようとしました セルエンティティを解決できないが動作しない場合。すべてのディビジョンエンティティが返され、それらを読み込む間に、Cellを解決しようとすると例外がスローされます。

これは、アプリケーション内の多くの場所でCellView接続が使用されているため、PostLoadイベントのこのような一般的なソリューションは、グローバルに対処するのに最適です。

答えて

1

私はFluentを使用していませんが、what .hbm.xml mappings can doを複製する場合は、コレクションにフィルタを定義して適用する必要があります。これにより、あなたのケースを処理できるようになります。

フィルタを使用すると、エンティティコレクションの要素にいくつかのパラメータ化された制限を定義できます。セッションの開始後にパラメータを設定してフィルタを有効にすることができます。ここでは、ユーザーが誰であるかを知る必要があります。

実際、フィルタはマッピング外で定義することができます。したがって、Fluentがそれらを処理しなくても、フィルタを使用できるはずです。 Nhibernate reference documentationから

例:コメントの後

ICollection<Cat> blackKittens = session.CreateFilter(
    pk.Kittens, "where this.Color = ?", Color.Black, NHibernateUtil.Enum(typeof(Color)) 
).List<Cat>(); 

詳細:

フィルタがあまりにもサブエンティティをナビゲートすることができるはずです。しかし、あなたのケースはちょっと邪魔です(外部キーは定義されていますが、外部エンティティは検出されません)ので、サブエンティティの非ヌル属性をテストする必要があります。 (そうでなければNHibenateは非常に可能性の高い親の外部キーのテストでそれを簡素化します。)

"where this.Cell.SomeNonNullableProperty is not null" 

これはSQLに変換されるだろうと例外なしに実行されなければならない、とあなたの非アクセス部門を除外します。

ちなみに、Divisionリストに明示的に問い合わせを行う場合、フィルターがあなたの答えにはならない場合があります。 (コレクションとしてそれらを参照するエンティティを介してそれらを取得していない)。そのような場合は、単純に上記の条件をクエリで直接使用します。

例外を処理するだけの場合は、not-found="ignore|exception"オプションのmany-to-oneリレーションシップを使用してマッピングを調整することもできます。しかし、私はそれがレイジーローディングでうまくいくかどうかはわかりませんが、私はそれを試したことはありません。 (そして、私はこのオプションが流暢で利用可能かどうかわかりません。)

+0

フィルターのアイデアはいいようですが、特定の値(たとえば黒い猫)にフィルターしたくないのですが、サブタイプが存在していても(猫はタイプが「男性」です)、このタイプが適切かどうかをチェックしたい型がエラーを発生させるならば、catをロードしたり、返すことはありません。 (私はIsInitializedを使いたい)。あなたはそれが可能だと思いますか? –

+0

私は詳細を追加しました。 –

関連する問題