многие к любой
Если структура таблицы фиксирована и вы хотите использовать генератор идентификаторов identity
, я бы сопоставил исходные таблицы как 3 отдельных класса и сопоставил бы их с общим интерфейсом как any reference.
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 с абстрактным отображением базового класса. Это позволяет быстро извлекать данные, но вы не можете использовать генератор identity
для таблиц подклассов.
<class name="IReferral" abstract="true" table="Referral">
<id name="Id">
<generator class="hilo"/>
</id>
<property name="Name"/>
<union-subclass name="SourceA" table="SourceA">
<!-- class specific properties -->
</union-subclass>
<union-subclass name="SourceB" table="SourceB">
<!-- class specific properties -->
</union-subclass>
<union-subclass name="SourceC" table="SourceC">
<!-- class specific properties -->
</union-subclass>
</class>
подкласс
Если вы можете изменить таблицы, вы можете отобразить все 3 класса рефералов в одну и ту же таблицу, используя подкласс .
<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">
<!-- class specific properties -->
</subclass>
<subclass name="SourceB" discriminator-value="SourceB">
<!-- class specific properties -->
</subclass>
<subclass name="SourceC" discriminator-value="SourceC">
<!-- class specific properties -->
</subclass>
</class>