0

抽象 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」列に値がないのはなぜですか?

4

0 に答える 0