私はサブクラスに頭を悩ませ、Fluent nHibernate のサブクラスに参加しようと数日間試みてきましたが、何の進展もありませんでした。wiki を調べましたが、十分な情報が得られないようで、グーグルで検索すると、価値の低いコードを使用しているか、一見関係のない古い結果が返されます。
可能であれば、簡単な例が欲しいだけです
次のような 4 つのテーブルがあります。
+--------------+ +---------------+ +---------------+
| Animal | | AnimalType | | Reptile |
+==============+ +===============+ +===============+
| Id | | Id | | AnimalId |
| AnimalTypeId | | Description | | TongueLength |
| version | +---------------+ +---------------+
+--------------+
したがって、Animal テーブルには、テストとして、1 つの Id のみを含むルックアップ テーブルである AnimalType テーブルを参照する FK があります。
1 = 爬虫類
AnimalTypeId 列は、サブクラスを分割する識別子列であり、各動物テーブル (爬虫類) には、AnimalTypeId に応じて Animal テーブルの Id を参照する FK プライマリ キーがあるという考えです。
したがって、私の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>
編集: エンティティの重複に関して以前に問題がありました。解決策は次のコメントにリンクされています。