几天来,我一直试图围绕子类和在 Fluent nHibernate 中加入子类而没有取得任何进展。我查看了 wiki,但它似乎没有给我足够的信息,并且谷歌搜索返回了使用折旧代码或看似无关的旧结果。
如果可能的话,我只想要一个简单的例子
我有四个看起来像这样的表:
+--------------+ +---------------+ +---------------+
| Animal | | AnimalType | | Reptile |
+==============+ +===============+ +===============+
| Id | | Id | | AnimalId |
| AnimalTypeId | | Description | | TongueLength |
| version | +---------------+ +---------------+
+--------------+
所以 Animal 表有一个引用 AnimalType 表的 FK,一个只包含 1 个 Id 的查找表,作为测试,
1 = 爬行动物
这个想法是 AnimalTypeId 列是我的区分我的子类的鉴别器列,并且每个动物表(爬行动物)都有 FK 主键,它们根据 AnimalTypeId 从 Animal 表中引用 Id。
所以我的 C# 类看起来像这样
public class Animal
{
public virtual int Id {get;set;}
public virtual AnimalType AnimalType {get;set;}
public virtual int Version {get; protected set;}
}
public class AnimalType
{
public virtual int Id {get;set;}
public virtual string Description {get;set;}
}
public class Reptile : Animal
{
public virtual int AnimalId {get;set;}
public virtual float TongueLength {get;set;}
}
如何将其映射为每个表的子类?
这是我当前的映射。
public class AnimalMap : ClassMap<Animal>
{
public AnimalMap()
{
Table("Animal");
Id(x => x.Id);
DiscriminateSubClassesOnColumn("AnimalTypeId",0)
.AlwaysSelectWithValue();
Version(x => x.Version);
}
}
public class ReptileMap: SubclassMap<Reptile>
{
public ReptileMap()
{
DiscriminatorValue(1);
Table("Reptile");
KeyColumn("AnimalId");
Map(x => x.TongueLength);
}
}
public class AnimalTypeMap : ClassMap<AnimalType>
{
public AnimalTypeMap ()
{
Table("AnimalTypeMap");
Id(x => x.Id);
Map(x => x.Description);
}
}
它几乎可以工作,只是似乎没有发现子类来自不同的表。HBM 映射如下。
<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" discriminator-value="0" schema="dbo" name="NamespaceDefault.Animal, SolEntity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Animal">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="identity" />
</id>
<discriminator type="Int32" force="true">
<column name="AnimalTypeId" />
</discriminator>
<version name="Version" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Version" />
</version>
<subclass name="NamespaceDefault.Reptile, SolEntity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="1">
<property name="TongueLength" type="System.Float, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="TongueLength" />
</property>
</subclass>
</class>
</hibernate-mapping>
编辑:之前存在重复实体的问题。解决方案在下一条评论中链接。