6

几天来,我一直试图围绕子类和在 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>

编辑:之前存在重复实体的问题。解决方案在下一条评论中链接。

4

0 回答 0