彼がうまくいかないのではないかと心配しています。設計および<join>
の性質による 。ドキュメントに記載されているとおり:
(私は)の方法 この問題の解決は少し異なります。オブジェクトLanguage
があります 、オプションには言語のコレクションがあります
public virtual IList<Language> Languages {get; set;}
マッピングは、たとえば<bag>
です。
<bag name="Languages" batch-size="25"
cascade="all-delete-orphan" inverse="true" >
<key column="option_id" />
<one-to-many class="Language" />
<filter name="LanguagFilter" condition=":languageId = LanguageId" />
</bag>
秘訣はフィルターにあります 。これは、 whereの動的バージョンです。 マッピング属性(18.1。NHibernateフィルター)
<filter-def name="LanguageFilter" >
<filter-param name="languageId" type="Int32" />
</filter-def>
次に、現在のセッションのすべての操作に対して、フィルターをオンにすることができます。言語IDがわかっているAOP内で、リクエストごとに1回だけ(Webアプリの場合):
var filter = session.EnableFilter("LanguageFilter");
filter.SetParameter("languageId", theCurrentLanguageIdFromUser);
そして最後に、Languagesコレクションにはレコードが1つしか含まれておらず、いつでも.First()
にアクセスできることがわかります。 。より多くの言語で複数の結果がなくなる
参照: https://stackoverflow.com/a/16625867/1679310 、 https://stackoverflow.com/a/18479266/1679310