抽象 BaseClass と 2 つの DerivedClasses があります。BaseClass 型を保持する OwnerClass もありますIList
。
Table Per Concrete Class (TPC) モデルに従ってクラスをマッピングしました。
public class BaseClassMap : ClassMap<BaseClass>
{
public BaseClassMap()
{
// ID + Fields Mapping...
UseUnionSubClassForInheritanceMapping();
}
}
public class DerivedClass1Map : SubclassMap<DerivedClass1>
{
public DerivedClass1Map()
{
// Fields Mapping...
}
}
public class DerivedClass2Map : SubclassMap<DerivedClass2>
{
public DerivedClass1Map()
{
// Fields Mapping...
}
}
public class OwnerClassMap : ClassMap<OwnerClas>
{
public OwnerClassMap()
{
// ID + Fields Mapping...
HasMany(x => x.BaseClassList).Cascade().All();
// Option 2 - Using Inverse:
// HasMany(x => x.BaseClassList).Cascade().All().Inverse();
}
}
マッピングによってテーブルを作成するように nhibernate を構成しました。DerivedClass ごとに、「Owner_Id」という名前の新しい列を含むテーブルが作成されました。抽象 BaseClass の場合、予想どおり、テーブルは作成されませんでした。
いくつかの BaseClasses オブジェクトを作成し、(新しい) DerivedClass1 と DerivedClass2 で埋めました。Owner オブジェクトを作成し、そのリストに BaseClasses オブジェクトを追加しました。
Owner オブジェクトを保存しようとすると、
GenericADOException: コレクションを挿入できませんでした... SQL: UPDATE BaseClass...
「BaseClass」という名前のテーブルがなかったので、そのテーブルにアクセスしようとしていることに驚きました。
OwnerClass マッピングでオプション 2 を試しました - Inverse() を追加します。所有者オブジェクトを保存すると、所有者オブジェクトが所有者テーブルに保存され、DerivedClasses オブジェクトがテーブルに保存されましたが、「Owner_Id」列に値がありませんでした。
Inverse() を使用する必要があるのはなぜですか? さらに重要なのは、「Owner_Id」列に値がないのはなぜですか?