许多到任何
如果表结构是固定的,并且您希望使用
identity
ID生成器,我将源表映射为3个单独的类,并映射到公共接口作为
any
参考文献。
class Case
{
public virtual IReferral Referral { get; set; }
}
class SourceA : IReferral
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Type { get { return "SourceA"; } }
}
interface IReferral
{
int Id { get; set; }
string Name { get; set; }
string Type { get; }
}
public class CaseMap : ClassMap<Case>
{
public CaseMap()
{
ReferencesAny(m => m.Referral)
.EntityTypeColumn("ReferralType")
.EntityIdentifierColumn("ReferralId")
.AddMetaValue<SourceA>("SourceA")
.AddMetaValue<SourceB>("SourceB")
.AddMetaValue<SourceC>("SourceC")
.IdentityType<int>();
}
}
并集子类
另一个选择是
union-subclass
使用抽象基类映射。这允许急取,但不能使用
身份
子类表上的生成器。
<class name="IReferral" abstract="true" table="Referral">
<id name="Id">
<generator class="hilo"/>
</id>
<property name="Name"/>
<union-subclass name="SourceA" table="SourceA">
</union-subclass>
<union-subclass name="SourceB" table="SourceB">
</union-subclass>
<union-subclass name="SourceC" table="SourceC">
</union-subclass>
</class>
子类
如果可以更改表,则可以使用
subclass
.
<class name="IReferral" abstract="true" table="Referral" discriminator-value="null">
<id name="Id">
<generator class="identity"/>
</id>
<discriminator column="Discriminator" not-null="true" type="System.String"/>
<property name="Name"/>
<subclass name="SourceA" discriminator-value="SourceA">
</subclass>
<subclass name="SourceB" discriminator-value="SourceB">
</subclass>
<subclass name="SourceC" discriminator-value="SourceC">
</subclass>
</class>