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
- only abstract classes in different assemblies and
- 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
Post a Comment