2016-06-22 79 views
0

考慮一個包含三個表的數據庫:PET,CAT和EXTENSION.CAT其中Pet是Cat的基類,Extension.Cat包含具有附加屬性的擴展表爲貓。如何使用NHibernate映射多個連接表的每個類策略

<class name="Pet" table = "PET"> 
    <id name="id" column="ID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <joined-subclass name="Cat" table="CAT"> 
     <key column="ID"/> 
     <property name="isMouser"/> 
    </joined-subclass> </class> 

和貓 - 這樣CATEX關係:使用這樣的貓的關係 - NHibernate的允許造型寵物

<class name="Cat" table="CAT"> 
    <id name="id" column="ID">...</id> 
    <property name="isMouser"/> 
    <join table="CAT" schema="EXTENSION" > 
     <key column="ID"/> 
     <property name="fuzziness"/> 
     <property name="cuteness"/> 
    </join> 
</class> 

所以,儘管我會假設以下應該工作,它不't:

<class name="Pet" table = "PET"> 
    <id name="id" column="ID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <joined-subclass name="Cat" table="CAT"> 
     <key column="ID" /> 
     <property name="isMouser"/> 
     <join table="CAT" schema="EXTENSION" > 
      <key column="ID"/> 
      <property name="fuzziness"/> 
      <property name="cuteness"/> 
     </join> 
    </joined-subclass> 
</class> 

Nhibernate文檔沒有描述這種情況。建模每個類層次結構的多表的正確方法是什麼?

回答

0

建模此場景的正確方法是使用隱式多態模式。

<class name="Cat" table = "PET"> 
    <id name="id" column="ID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <join table="CAT"> 
     <key column="id"/> 
     <property name="isMouser"/> 
    </join> 
    <join table="CAT" schema="EXTENSION" > 
     <key column="id"/> 
     <property name="fuzziness"/> 
     <property name="cuteness"/> 
    </join> 
</class> 

這裏的關鍵因素是父表(PET)是引用的第一個表,儘管我們正在對Cat類進行建模。該場景爲每個派生類有效地提供了多個表。

一個潛在的問題是連接列名稱不匹配,並且映射的類中存在子表列的屬性。 NHibernate需要這些額外的類屬性來進行映射。向子表屬性添加「generated = insert」,「insert = false」和「update = false」屬性可以告訴NHibernate使屬性爲只讀。

<class name="Cat" table = "PET"> 
    <id name="petid" column="PETID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <join table="CAT"> 
     <key column="catid"/> 
     <property name="isMouser"/> 
     <property name="catid" generated="insert" insert="false" update="false" /> 
    </join> 
    <join table="CAT" schema="EXTENSION" > 
     <key column="catexid"/> 
     <property name="fuzziness"/> 
     <property name="cuteness"/> 
     <property name="catexid" generated="insert" insert="false" update="false" /> 
    </join> 
</class> 
相關問題