I think the API has changed since this question was asked, but this works for me:
public class SomeSubclassMap : SubclassMap<SomeSubclass> {
public SomeSubclassMap()
{
KeyColumn("SomeKeyColumnID");
Map(x => x.SomeSubClassProperty);
...
}
}
I believe KeyColumn is only required if it's different than 'Baseclassname_id'
Note: There should also be a ClassMap<SomeBaseClass>
for the base class that SomeSubClass extends.
I figured it out in case of enums.
Considering this enum type:
public enum ActivityType
{
[EnumKey("1")]
[EnumDescription("ImportFromFile")]
ImportFromFile,
}
where EnumKey and EnumDescription are (popular) extension methods, I redefine Activity like
public abstract class Activity
{
public virtual Guid Id { get; set; }
public virtual ActivityExecutionResult ExecutionResult { get; private set; }
public virtual ActivityExecutionStatus ExecutionStatus {get;private set;}
public abstract ActivityExecutionStatus Execute();
public virtual string ActivityName { get; private set; }
public virtual IDictionary<string, string> ActivityParameters { get; private set; }
public virtual ActivityType ActivityType { get; private set; }
}
The mapping file looks like this:
public class ActivityMap : ClassMap<Activity>
{
public ActivityMap()
{
Table("Activities");
Id(x => x.Id).Column("ID").GeneratedBy.Guid();
Map(x => x.ActivityName).Not.Nullable().Length(50);
Map(x => x.ActivityType).CustomType<int>().Column("ActivityType").Not.Nullable();
HasMany(x => x.ActivityParameters)
.KeyColumn("ActivityID")
.AsMap<string>(idx => idx.Column("ParameterName"), elem => elem.Column("ParameterValue"))
.Not.LazyLoad()
.Cascade.Delete()
.Table("ActivityParameters");
DiscriminateSubClassesOnColumn("ActivityType");
}
}
public class ImportActivityFromFileMap : SubclassMap<ImportActivityFromFile>
{
public ImportActivityFromFileMap()
{
DiscriminatorValue(ActivityType.ImportFromFile.GetKey());
}
}
The generated hbm file looks like:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="***.Activity, ***, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Activities">
<id name="Id" type="System.Guid, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
<generator class="guid" />
</id>
<discriminator column="ActivityType" type="String" insert="true" not-null="true" />
<property name="ActivityName" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ActivityName" length="50" not-null="true" />
</property>
<property name="ActivityType" type="Int32">
<column name="ActivityType" not-null="true" />
</property>
<map cascade="delete" lazy="false" name="ActivityParameters" table="ActivityParameters">
<key>
<column name="ActivityID" />
</key>
<index type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ParameterName" />
</index>
<element type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ParameterValue" />
</element>
</map>
<subclass name="***.ImportActivityFromFile, ***, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="1" />
</class>
</hibernate-mapping>
It works like a charm!
Best Answer
Just put an empty lambda in,
c => {}
.