I'm using the table-per-subclass strategy, mapped as joined-subclass. 

BTW, I solved the issue by providing a custom IModelInspector (derived 
from ExplicitlyDeclaredModel) which override IsEntity to return false for 
BusinessContact. This works perfectly fine.

Am Donnerstag, 21. März 2013 08:22:36 UTC+1 schrieb Mac Reiben:
>
> Hi,
>
> I'm not a Hibernate export, but I don't see how you define the inheritance 
> strategy ? 
>
> http://nhforge.org/doc/nh/en/index.html#inheritance-strategies
>
> You have to define a strategy of inheritance in your mapping.
>
> Regards,
> Mac.
>
> Le mercredi 20 mars 2013 09:25:15 UTC+1, Andre a écrit :
>>
>> Hello, 
>>
>>
>> I have a class hierarchy that conceptually looks similar to this:
>>
>>
>> <https://lh4.googleusercontent.com/-w3hKntlRKnY/UUlxrFoGCwI/AAAAAAAAAGA/J3kwGDGDT-k/s1600/original.jpg>
>>
>>
>>
>> That is, there's an abstract base class (Relation) and a couple of 
>> derived classes. In practice, Customer and Supplier share a lot of code, so 
>> I refactored the commonoalities into an abstract class BusinessContact. Now 
>> the actual class hierarchy looks like this:
>>
>>
>>
>> <https://lh4.googleusercontent.com/-gK8StoiTOLw/UUlxwXsdouI/AAAAAAAAAGI/puqW6tyODqY/s1600/augmented.jpg>
>>
>>         
>> Or in code:
>>
>>     public abstract class Relation
>>     {
>>         public virtual int Id { get; set; }
>>     }
>>
>>     public class ContactPerson : Relation
>>     {
>>         public virtual string PhoneNumber { get; set; }
>>     }
>>
>>     public abstract class BusinessContact : Relation
>>     {
>>         public virtual string Name { get; set; }
>>     }
>>
>>     public class Customer : BusinessContact
>>     {
>>         public virtual string CustomerNumber { get; set; } 
>>     }
>>
>>     public class Supplier : BusinessContact
>>     {
>>         public virtual string SupplierNumber { get; set; }
>>     }
>>
>> I'd like to map this hierarchy to four tables (Relation, ContactPerson, 
>> Customer and Supplier) using joined-subclasses in NHibernate, using 
>> mapping-by-code (ModelMapper). My mapping looks like this:
>>
>>     var mapper = new ModelMapper();
>>
>>     mapper.Class<Relation>(map =>
>>     {
>>         map.Id(x => x.Id, id => id.Generator(Generators.Native));
>>     });
>>
>>     mapper.JoinedSubclass<ContactPerson>(map =>
>>     {
>>         map.Key(key => key.Column("Id"));
>>         map.Property(x => x.PhoneNumber);
>>     });
>>
>>     mapper.JoinedSubclass<Customer>(map =>
>>     {
>>         map.Key(key => key.Column("Id"));
>>         map.Property(x => x.Name);
>>         map.Property(x => x.CustomerNumber);
>>     });
>>
>>     mapper.JoinedSubclass<Supplier>(map =>
>>     {
>>         map.Key(key => key.Column("Id"));
>>         map.Property(x => x.Name);
>>         map.Property(x => x.SupplierNumber);
>>     });
>>
>>
>>
>> However, as soon as I try to add the mapping to the Configuration I get 
>> an exception:
>>
>>     NHibernate.MappingException: Cannot extend unmapped class: 
>> BusinessContact
>>
>> I basically understand why this happens. The generated mapping looks like 
>> this:
>>
>>     <?xml version="1.0" encoding="utf-8"?>
>>     <hibernate-mapping xmlns:xsi="
>> http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="
>> http://www.w3.org/2001/XMLSchema"; namespace="JoinedSubClassMapping" 
>> assembly="JoinedSubClassMapping" xmlns="urn:nhib    ernate-mapping-2.2">
>>       <class name="Relation" abstract="true">
>>         <id name="Id" type="Int32">
>>           <generator class="native" />
>>         </id>
>>       </class>
>>       <joined-subclass name="ContactPerson" extends="Relation">
>>         <key column="Id" />
>>         <property name="PhoneNumber" />
>>       </joined-subclass>
>>       <joined-subclass name="Customer" extends="BusinessContact">
>>         <key column="Id" />
>>         <property name="CustomerNumber" />
>>       </joined-subclass>
>>       <joined-subclass name="Supplier" extends="BusinessContact">
>>         <key column="Id" />
>>         <property name="SupplierNumber" />
>>       </joined-subclass>
>>     </hibernate-mapping>
>>
>> Customer and Supplier define BusinessContact in their extends attribute, 
>> as if BusinessContact was a "normal" entity in the model. As there's no 
>> mapping for BusinessContact, this fails, or course. Note that the "Name" 
>> property (defined in BusinessContact does not appear in the mapping either.
>>
>> What I *want *the mapping to look like is this:
>>
>>     <?xml version="1.0" encoding="utf-8" ?>
>>     <hibernate-mapping xmlns:xsi="
>> http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="
>> http://www.w3.org/2001/XMLSchema"; namespace="JoinedSubClassMapping" 
>> assembly="JoinedSubClassMapping" xmlns="urn:nhibernate-mapping-2.2">
>>       <class name="Relation" abstract="true">
>>         <id name="Id" type="Int32">
>>           <generator class="native" />
>>         </id>
>>       </class>
>>       <joined-subclass name="ContactPerson" extends="Relation">
>>         <key column="Id" />
>>         <property name="PhoneNumber" />
>>       </joined-subclass>
>>       <joined-subclass name="Customer" extends="Relation">
>>         <key column="Id" />
>>         <property name="CustomerNumber" />
>>         <property name="Name" />
>>       </joined-subclass>
>>       <joined-subclass name="Supplier" extends="Relation">
>>         <key column="Id" />
>>         <property name="SupplierNumber" />
>>         <property name="Name" />
>>       </joined-subclass>
>>     </hibernate-mapping>
>>
>> That is, make Supplier and Customer extend Relation and include all the 
>> mapped properties of the (otherwise unmapped) BusinessContact class.
>>
>> How can I achieve this?
>>
>> Thanks a lot for your time,
>> Andre
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers?hl=en-US.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to