2011-02-23 6 views
1

私は流暢な休止状態マップではかなり奇妙な要件があります。私は別のテーブル(B)と複合外来キー関係を持つテーブル(A)を持っています。テーブルAのマッピングでは、テーブルBから作成されたオブジェクトと、キーを定義するAの個々の属性へのアクセスの両方が必要です。それを行う方法はありますか?列を2度マップすると、範囲外の例外からインデックスを取得するようです。複数の列をマップする

テーブルBの行が存在しない可能性があるため、属性のBを探索することはできません。私は、私が扱っている構造にいくつかの重大な匂いがあることを痛感しています。これは、レガシーシステムを扱う人の運命です。

答えて

1

それはちなみにも可能で、少しハッキングします。

我々は、我々が見つかった場合、単一の関連要素を取得するために使用します偽の収集とそのドメインを定義するつもりだ:

public class Foo 
{ 
    public virtual BarKey BarKey { get; set; } 
    public virtual Bar Bar { get { return Bars.SingleOrDefault(); } } 
    protected virtual ICollection<Bar> Bars { get; set; } 
} 

public class Bar 
{ 
    public virtual BarKey Id { get; set; } 
} 

//this class must override Equals and GetHashcode. Implementation not shown. 
public class BarKey 
{ 
    public virtual int X { get; set; } 
    public virtual int Y { get; set; } 
} 

BarKeyコンポーネントはの一部であるプロパティが含まれていますキー。今

、マッピング:NHが伝え

<class name="Foo"> 
    <id ...><generator .../></id> 
    <component name="BarKey"> 
    <property name="X" /> 
    <property name="Y" /> 
    </component> 
    <bag name="Bars" inverse="true"> 
    <key property-ref="BarKey"> 
     <column name="X"/> 
     <column name="Y"/> 
    </key> 
    <one-to-many class="Bar"/> 
    </bag> 
</class> 
<class name="Bar"> 
    <composite-id name="Id"> 
    <key-property name="X" /> 
    <key-property name="Y" /> 
    </composite-id> 
</class> 

property-ref属性がfooの代わりに、そのIdのBarKeyプロパティに対してバーでそれらの列にマッチします。

関連する問題