2010-02-04 78 views
2

編輯:更改了類名。流利的NHibernate - 帶共享參考的子類

我使用功能NHibernate(V 1.0.0.614)自動映射以下組類(其中實體是在S#ARP架構框架提供的基類):

public class Car : Entity 
{ 
    public virtual int ModelYear { get; set; } 
    public virtual Company Manufacturer { get; set; } 
} 

public class Sedan : Car 
{ 
    public virtual bool WonSedanOfYear { get; set; } 
} 

public class Company : Entity 
{ 
    public virtual IList<Sedan> Sedans { get; set; } 
} 

這導致以下配置(寫入hbm.xml):

<class name="Company" table="Companies"> 
    <id name="Id" type="System.Int32" unsaved-value="0"> 
     <column name="`ID`" /> 
     <generator class="identity" /> 
    </id> 
    <bag cascade="all" inverse="true" name="Sedans" mutable="true"> 
     <key> 
      <column name="`CompanyID`" /> 
     </key> 
     <one-to-many class="Sedan" /> 
    </bag> 
    </class> 

    <class name="Car" table="Cars"> 
    <id name="Id" type="System.Int32" unsaved-value="0"> 
     <column name="`ID`" /> 
     <generator class="identity" /> 
    </id> 
    <property name="ModelYear" type="System.Int32"> 
     <column name="`ModelYear`" /> 
    </property> 
    <many-to-one cascade="save-update" class="Company" name="Manufacturer"> 
     <column name="`CompanyID`" /> 
    </many-to-one> 
    <joined-subclass name="Sedan"> 
     <key> 
      <column name="`CarID`" /> 
     </key> 
     <property name="WonSedanOfYear" type="System.Boolean"> 
      <column name="`WonSedanOfYear`" /> 
     </property> 
    </joined-subclass> 
    </class> 

到目前爲止好!但現在來了醜陋的一部分。生成的數據庫表格:

Table: Companies 
Columns: ID (PK, int, not null) 

Table: Cars 
Columns: ID (PK, int, not null) 
     ModelYear (int, null) 
     CompanyID (FK, int, null) 


Table: Sedan 
Columns: CarID (PK, FK, int, not null) 
     WonSedanOfYear (bit, null) 
     CompanyID (FK, int, null) 

而不是公司的一個FK,我得到兩個!

如何確保我只獲得一個公司的FK?覆蓋自動映射?制定一個公約?或者這是一個錯誤?你的想法表示讚賞。

回答

0

我感覺到你的痛苦。

我沒有,因爲我的時間不多了該在這個時間點以下

public class JoinedSubclassConvention : IJoinedSubclassConvention 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     switch (instance.EntityType.Name) 
     { 
      case "Business": 
       instance.Key.ForeignKey("FK_Business_Customer"); 
       break; 
      case "Person": 
       instance.Key.ForeignKey("FK_Person_Customer"); 
       break; 
      case "StaffMember": 
       instance.Key.ForeignKey("FK_StaffMember_Customer"); 
       break; 
     } 
    } 
} 
相關問題