2010-05-27 5 views
0

Je voudrais configurer l'héritage table-per-classhierarchy dans le code nhibernate thru. Tout le reste est défini dans les fichiers de mappage XML à l'exception des sous-classes. Si je place les sous-classes dans xml tout va bien, mais pas de code. Voici le code que j'utilise - ma sous-classe concrète ne se crée :(Sous-classe nhibernate dans le code

//the call 
NHibernate.Cfg.Configuration config = new NHibernate.Cfg.Configuration(); 
SetSubclass(config, typeof(TAction), typeof(tActionSub1), "Procedure"); 

//the method 
public static void SetSubclass(Configuration configuration, Type baseClass, Type subClass, string discriminatorValue) 
{ 
      PersistentClass persBaseClass = configuration.ClassMappings.Where(cm => cm.MappedClass == baseClass).Single(); 
      SingleTableSubclass persSubClass = new SingleTableSubclass(persBaseClass); 
      persSubClass.ClassName = subClass.AssemblyQualifiedName; 
      persSubClass.DiscriminatorValue = discriminatorValue; 
      persSubClass.EntityPersisterClass = typeof(SingleTableEntityPersister); 
      persSubClass.ProxyInterfaceName = (subClass).AssemblyQualifiedName; 
      persSubClass.NodeName = subClass.Name; 
      persSubClass.EntityName = subClass.FullName; 
      persBaseClass.AddSubclass(persSubClass); 
} 

la cartographie Xml ressemble à ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Riz.Pcm.Domain.BusinessObjects" assembly="Riz.Pcm.Domain"> 
    <class name="Riz.Pcm.Domain.BusinessObjects.TAction, Riz.Pcm.Domain" table="dbo.tAction" lazy="true"> 
    <id name="Id" column="ID"> 
     <generator class="guid" /> 
    </id> 
    <discriminator type="String" formula="(select jt.Name from TJobType jt where jt.Id=JobTypeId)" insert="true" force="false"/> 
    <many-to-one name="Session" column="SessionID" class="TSession" /> 
    <property name="Order" column="Order1" /> 
    <property name="ProcessStart" column="ProcessStart" /> 
    <property name="ProcessEnd" column="ProcessEnd" /> 
    <property name="Status" column="Status" /> 
    <many-to-one name="JobType" column="JobTypeID" class="TJobType" /> 
    <many-to-one name="Unit" column="UnitID" class="TUnit" /> 
    <bag name="TActionProperties" lazy="true" cascade="all-delete-orphan" inverse="true" > 
     <key column="ActionID"></key> 
     <one-to-many class="TActionProperty"></one-to-many> 
    </bag> 
    <!--<subclass name="Riz.Pcm.Domain.tActionSub" discriminator-value="ZPower"></subclass>--> 
    </class> 
</hibernate-mapping> 

Qu'est-ce que je fais mal, je ne peux pas trouver des exemples sur? . google :(

Répondre

0

Nous utilisons FluentNHibernate pour la cartographie L'entité utilisateur est une classe de base pour l'apprenant, assesseur, admin, etc.

Voici un exemple:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     this.Id(x => x.Id); 

     this.Map(x => x.Active); 

     this.Component(
      x => x.Address, 
      m => 
      { 
       m.Map(x => x.Address1).Length(512); 
       m.Map(x => x.Address2); 
       m.Map(x => x.Address3); 
       m.Map(x => x.Address4); 
       m.Map(x => x.City); 
       m.Map(x => x.County); 
       m.Map(x => x.PostCode); 
       m.References(x => x.Country); 
      }); 

     this.References(x => x.CreatedBy); 

     this.Map(x => x.CreatedDate).Not.Nullable(); 

     this.DiscriminateSubClassesOnColumn("className").Length(64); 
    } 
} 

et classe dérivée

public class LearnerMap : SubclassMap<Learner> 
{ 
    #region Constructors and Destructors 

    /// <summary> 
    /// Initializes a new instance of the <see cref="LearnerMap"/> class. 
    /// </summary> 
    public LearnerMap() 
    { 
     this.Map(x => x.DateOfBirth); 
     this.Map(x => x.NINumber); 
     this.Map(x => x.IscCodeId); 
     this.Map(x => x.ScnNo); 
     this.Map(x => x.ULN); 


     this.HasManyToMany(x => x.Organisation) 
      .ParentKeyColumn("userId") 
      .ChildKeyColumn("organisationId").Table(
      "UserOrganisations"); 
    } 

Espérons que cela vous aidera

Questions connexes