2012-04-05 3 views
1

私は、テーブルAオブジェクトがいくつかのテーブルBレコードを1対多のものとしてマッピングする必要があるが、テーブルBは、それを1対多にする。これは、従来の他のレガシープログラムのために簡単に変更できないレガシーデータベース構造です。Nhibernateでは、外部キー列以外のマッピングの他の基準を使用して、1対多になるものをさらに制限できますか?

TableBPKey (int not null) 
TableAFKey (int not null) 
TableBColumn1 (char(4) null) 
TableBColumn2 (varchar(50) null) 

はTableBColumn1レコードが何らかの方法でテーブルBのレコードを分類する「N」4文字コードのいずれかを含む可能性があるとしましょう:

は、テーブルBは、次のようになりますと言うことができます。

とにかく、既にTableAFKey列を使用して1にマッピングしているとします。私はまた、それらのレコードがTableBColumn1 == "ABCD"の場合にのみ必要であることをマッピングに伝えることはできますか?

コードによるマッピングを使用するものはどれも望ましい解決策です。古いxmlマッピングではできますが、コードでマッピングすることはできませんが、これも解決策として使用します。

ありがとうございます!

+1

ページは、多くののためであることを確認してくださいhttp://stackoverflow.com/questions/1898303/nhibernate-where-clause-on-one-to-many-relationships-doesnt-work-when-column-n – Eranga

答えて

0

map.Whereは()私が欲しかったものです。私はそれをテストし、それは動作します。 SQL Where句の後に動作するSQL式を置くことができ、そのように結果を制限します。

Set<TableBObject>(x => x.TableBRecordsABCDOnly, map => 
      { 

       map.Inverse(true); 
       map.Cascade(Cascade.All); 
       map.Key(k => k.Column(c => c.Name("TableAFKey"))); 
       map.Where("TableBColumn1 = 'ABCD'"); 

      }, 
      action => action.OneToMany()); 
1

私はOne-to-Manyの "Formula"メソッドがあなたの後にあると信じています。これを使用して、追加のSQL基準を指定することができます(たとえば、 "is_active = 1")。

ここに詳しい情報があります。 http://notherdev.blogspot.com.au/2012/02/mapping-by-code-map.html

(更新リンク)

+0

1つではなく、1つから多くへ –

+0

おっと、これを試してみてください。 http://notherdev.blogspot.com.au/2012/02/mapping-by-code-map.html –

+0

私は彼らにそこに言及していない –

関連する問題