c# - Fluent NHibernate table-per-inheritance (TPH) mapping for multi class in the hierarchy -


hello everyone,

i'm struggling 1 fluent nhibernate issue. have following template of class structure in solution:

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;} } 

and want use table-per-inheritance hierarchy strategy classes contains data in 1 table in database.

how possible via fluent nhibernate?

i have tried following cases:

1. have added discriminator parent class

 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");         }  } 

but have got exception: (xmldocument)(56,8): xml validation error: element 'subclass' in namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'joined-subclass' in namespace 'urn:nhibernate-mapping-2.2'. list of possible elements expected: 'meta, tuplizer, synchronize, property, many-to-one, one-to-one, component, dynamic-component, properties, any, map, set, list, bag, idbag, array, primitive-array, join, subclass, loader, sql-insert, sql-update, sql-delete, resultset, query, sql-query' in namespace 'urn:nhibernate-mapping-2.2'.

because have following auto generated xml mapping nhibernate:

<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. have tried add different discriminators

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");         }  } 

but without results system (same exception , mapping file)

3. have tried use 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);     } } 

in case have 3 tables (oneclass, twoclass , threeclass in db) have got following xml mapping file:

<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> 

i don't know how can solve problem. maybe give me hand issue.

many thanks.

sincerely, alexey

i have tried address similar problem. in case, have class in 1 assembly , want inherit class in different assembly non-abstract base. fluent nhibernate not map second (inherited) class. posts above describe, seems possible map inheritance hierarchies when

  1. only abstract classes in different assemblies and
  2. all non-abstract classes inheritance hierarchy in same assembly

in opinion, severe design limitation domain modelling. can close fluent nhibernate project confirm not possible inherit non-abstract classes in different assemblies? or have solution addressing problem?

thanks, roland.


Comments

Popular posts from this blog

Change php variable from jquery value using ajax (same page) -

Pull out data related to my apps from Android Play Store and iOS App Store -

How can I fetch data from a web server in an android application? -