2013-05-15 85 views
2

大家好,功能NHibernate的table-per-繼承(TPH)映射多類層次結構中的

我有一個功能NHibernate問題掙扎。 我已經在我的解決方案如下階層結構的模板:

class OneClass 
{ 
    public virtual string OneProp {get; set;} 
} 

class TwoClass : OneClass 
{ 
    public virtual string TwoProp {get; set;} 
} 

class ThreeClass : TwoClass 
{ 
    public virtual string ThreeProp {get; set;} 
} 

而且我想使用的table-per-繼承層次戰略我類包含在數據庫中的一個表中的所有數據。

如何通過流利NHibernate做到這一點?

我已經嘗試了以下情況:

1.我已經加入鑑別器的父類

public class OneClassMappingOverride : IAutoMappingOverride<OneClass> 
{ 
     public void Override(AutoMapping<OneClass> mapping) 
     { 
      mapping.DiscriminateSubClassesOnColumn("Type"); 
      mapping.SubClass<OneClass>("OneClass"); 
      mapping.SubClass<TwoClass>("TwoClass"); 
      mapping.SubClass<ThreeClass>("ThreeClass"); 
     } 
} 

但我有例外:(XmlDocument的)(56,8):XML驗證錯誤:命名空間'urn:nhibernate-mapping-2.2'中的元素'subclass'在命名空間'urn:nhibernate-mapping-2.2'中具有無效的子元素'joined-subclass'。可能的元素列表:meta,tuplizer,同步,屬性,多對一,一對一,組件,動態組件,屬性,任意,映射,集合,列表,包,idbag,數組,原語在'urn:nhibernate-mapping-2.2'命名空間中的'-array,join,subclass,loader,sql-insert,sql-update,sql-delete,resultset,query,sql-query'。

,因爲我有以下自動生成的NHibernate的XML映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="MyClass.Domain.OneClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`OneClass`"> 
    <cache usage="read-write" /> 
    <id name="PersistenceId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="Systematic.Persistence.NHibernate.NHibernateIdGenerator, Systematic.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </id> 
    <discriminator type="String"> 
     <column name="Type" /> 
    </discriminator> 
    <version generated="never" name="PersistedVersion" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0"> 
     <column name="PersistedVersion" /> 
    </version> 
    <property name="OneProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="OneProp" length="255" /> 
    </property> 
    <property name="DisplayName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="DisplayName" length="256" index="idx__DisplayName" /> 
    </property> 
    <property name="SystemName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="SystemName" length="256" index="idx__SystemName" not-null="true" /> 
    </property> 
    <property name="Version" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Version" not-null="true" /> 
    </property> 
    <property name="Description" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Description" length="10000000" /> 
    </property> 
    <many-to-one class="Systematic.Persistence.PersistenceInfo, Systematic.Api, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" fetch="join" lazy="false" name="Persistence"> 
     <column name="Persistence_id" index="idx__Persistence" not-null="true" /> 
    </many-to-one> 
    <subclass name="MyClass.Domain.TwoClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <property name="TwoProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="TwoProp" length="255" /> 
     </property> 
     <joined-subclass name="MyClass.Domain.ThreeClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <key> 
      <column name="TwoClass_id" /> 
     </key> 
     <property name="ThreeProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <column name="ThreeProp" length="255" /> 
     </property> 
     </joined-subclass> 
    </subclass> 
    </class> 
</hibernate-mapping> 

2.我已嘗試添加不同的鑑別

public class OneClassMappingOverride : IAutoMappingOverride<OneClass> 
{ 
     public void Override(AutoMapping<OneClass> mapping) 
     { 
      mapping.DiscriminateSubClassesOnColumn("OneType"); 
     } 
} 

public class TwoClassMappingOverride : IAutoMappingOverride<TwoClass> 
{ 
     public void Override(AutoMapping<TwoClass> mapping) 
     { 
      mapping.DiscriminateSubClassesOnColumn("TwoType"); 
     } 
} 

但是,如果沒有從系統(同樣的異常和任何結果映射文件)

3.我試圖使用ClassMap <>和SubclassMap <>

public class OneClassMap : ClassMap<OneClass> 
{ 
    public OneClassMap() 
    { 
     DiscriminateSubClassesOnColumn("Type"); 

     Id(x => x.Id); 

     Map(x => x.OneProp); 
    } 
} 

public class TwoClassMap : SubclassMap<TwoClass> 
{ 
    public TwoClassMap() 
    { 
     DiscriminatorValue("TwoType"); 

     Map(x => x.TwoProp); 
    } 
} 

public class ThreeClassMap : SubclassMap<ThreeClass> 
{ 
    public ThreeClassMap() 
    { 
     DiscriminatorValue("ThreeType"); 

     Map(x => x.ThreProp); 
    } 
} 

在這種情況下,我有三個表(OneClass,TwoClass和三級類在我的DB)還我有以下XML映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="MyClass.Domain.OneClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`OneClass`"> 
    <cache usage="read-write" /> 
    <id name="PersistenceId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="Systematic.Persistence.NHibernate.NHibernateIdGenerator, Systematic.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </id> 
    <version generated="never" name="PersistedVersion" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0"> 
     <column name="PersistedVersion" /> 
    </version> 
    <property name="OneProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="OneProp" length="255" /> 
    </property> 
    <property name="DisplayName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="DisplayName" length="256" index="idx__DisplayName" /> 
    </property> 
    <property name="SystemName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="SystemName" length="256" index="idx__SystemName" not-null="true" /> 
    </property> 
    <property name="Version" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Version" not-null="true" /> 
    </property> 
    <property name="Description" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Description" length="10000000" /> 
    </property> 
    <many-to-one class="Systematic.Persistence.PersistenceInfo, Systematic.Api, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" fetch="join" lazy="false" name="Persistence"> 
     <column name="Persistence_id" index="idx__Persistence" not-null="true" /> 
    </many-to-one> 
    <joined-subclass name="MyClass.Domain.TwoClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <key> 
     <column name="OneClass_id" /> 
     </key> 
     <property name="TwoProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="TwoProp" length="255" /> 
     </property> 
     <joined-subclass name="MyClass.Domain.ThreeClass, MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <key> 
      <column name="TwoClass_id" /> 
     </key> 
     <property name="ThreeProp" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <column name="ThreeProp" length="255" /> 
     </property> 
     </joined-subclass> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

我不我不知道如何解決我的問題。也許有人會幫我解決這個問題。

非常感謝。

真誠, 阿列克謝

回答

0

我相信,在你的情況下,這個問題可以通過在層級上不同類別而導致被放置在不同的組件。我也遇到過這個問題,看起來像這樣的案件不被Fluent支持。

我找到了我的情況here,他們通過使父類抽象來修復它。仍在努力查明是否有其他方式或官方聲明稱其不被支持,但尚未成功。

+0

與抽象類它真的有效,但只是類問題仍然打開。 –

1

我試圖解決類似的問題。同樣在我的情況下,我在一個程序集中有一個類,並且想從這個非抽象的基類繼承一個不同程序集中的類。流利的NHibernate將不會映射第二個(繼承的)類。正如上面的職位描述,似乎只可能在

  1. 只有抽象類是在不同的組件和
  2. 從繼承層次結構的所有非抽象類是在同一組件繼承層次映射

在我看來,這是一個非常嚴格的領域建模設計限制。能否接近Fluent NHibernate項目的人確認不可能繼承不同程序集中的非抽象類?還是有人有解決這個問題的解決方案?

謝謝,羅蘭。