2016-04-13 21 views
0

私はすべてがかなりうんざりすることがわかったので、この質問を本当に怖がることすら恐れています。しかし、あなたはレガシーデータベースで何をするつもりですか?それは上記のレンダリングからはっきりしていない場合はFluent NHibernate Complexコンポジットキーマッピング

私は、次の3つのテーブル

Generator Alarm   AlarmDescription 
--------- -----   ---------------- 
      Id    Id 
Id  <- GensetId  DescriptionText 
      EventTypeId -> AlarmCode 
PanelId ----------------> PanelId 

を持って、私は発電機セットとAlarmDescriptionの両方を持っているアラームを、持っています。 Gensetは、GensetIdプロパティを介して直接マッピング可能です。 AlarmDescriptionはIdプロパティから簡単にマッピング可能でなければなりません。しかし、それはそのようには設計されておらず、代わりに(AlarmCode, PanelId)というコンポジットからマッピングされています(データを検査するまでは関係を見つけるのに苦労して同じフィールド名を共有しません)。

このように、Fluent NHibernateを使ってどのようにマッピングしますか?私はいくつかのバリエーションを試しましたが、失敗しました。次のようなものは理想的ですが、このようなものは必ずしも直接利用できるとは思いません。

References(x => x.AlarmDescription) 
     .Column("AlarmCode", m => m.EventTypeId) 
     .Column("PanelId", m => m.Genset.PanelId) 

答えて

0

数式を試しましたか? (申し訳ありませんが、私は流暢使用しておりません。)

<many-to-one name="AlarmDescription"> 
    <column name="EventTypeId" /> 
    <formula>(select g.PanelId from Generator g where g.Id = GensetId)</formula> 
</many-to-one> 

これはcomposite idAlarmCodePanelId)であるとしてAlarmDescription主キーを宣言する必要があり。

あなたがAlarmDescription IDを保持する必要がある場合は、それnatural-idcomponentように追加します。

<class name="AlarmDescription"> 
    <id name="Id"> 
    <generator .../> 
    </id> 
    <natural-id> 
    <component name="AlarmDescriptionNaturalId"> 
     <property name="AlarmCode" /> 
     <property name="PanelId" /> 
    </component> 
    </natural-id> 
    ... 

をそしてproperty-refAlarmのおかげで、あなたの関係のためのキーとしてそれを参照:

<many-to-one name="AlarmDescription" property-ref="AlarmDescriptionNaturalId"> 
    <column name="EventTypeId" /> 
    <formula>(select g.PanelId from Generator g where g.Id = GensetId)</formula> 
</many-to-one> 
+0

数式は、私がやってきた結論です。私はそれを行うためのより魅力的な方法があると思っていました。 – shortstuffsushi

+0

私はそれをマップする方法があるとは思っていませんでした。私は、このような場合には、数式を使用する(またはdbを変更する)以外には、他の解決策を期待していません。 –