0

Fluent NHibernate (1.2.0.712) を使用した既存のデータベースへの階層ごとのテーブル マッピングに問題があります。これが単純化されたケースです。

私のクラス構造:

クラス図

データベース構造:

データベース図

したがって、基本的に、いくつかの特定のデータ (ID と名前) + いくつかの外部キー (参照オブジェクト 1 または参照オブジェクト 2) を含む 1 つのテーブル (エンティティ) があります。

抽象クラス AbstractEntity には Id と Name が含まれます。ConcreteEntity1 と ConcreteEntity2 は派生クラスです。

データベース内の参照に応じてこれらの派生インスタンスをマップしたいので、ReferencedObject1 への参照がある場合 -> ConcreteEntity1 のインスタンスです。ReferencedObject2 への参照がある場合 -> ConcreteEntity2 のインスタンスです。

いくつかのコード:

public class AbstractEntity
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}
public class ConcreteEntity1 : AbstractEntity
{
    public virtual ReferencedObject1 ReferencedObject1 { get; set; }
}
public class ConcreteEntity2 : AbstractEntity
{
    public virtual ReferencedObject2 ReferencedObject2 { get; set; }
}


public class AbstractEntityMap : ClassMap<AbstractEntity>
{
    public AbstractEntityMap()
    {
        Table("Entities");
        Id(e => e.Id);
        Map(e => e.Name);
    }
}

実際、私の質問は、派生クラスをどのようにマップすればよいですか? 流暢なnhibernate wikiを調べたところ、

クラス階層ごとのテーブル戦略を実行したい場合は、ClassMap で識別子列を指定するだけです。

しかし、私が理解している限り、識別子の列はありません。私のケースは、外部キー参照に応じてサブクラスを決定することです。

注: 複数の識別子列には DiscriminateSubClassesOnColumn("").Formula([insert custom sql here]) を使用します

式の使用法の良い例が見つかりません。私の場合に役立ちますか?そして、私は少し混乱しています、多分私は何か間違ったことをしていますか?

誰でも私を助けることができますか?前もって感謝します :)

4

1 に答える 1

1
DiscriminateSubClassesOnColumn("")
    .Formula(case when ReferencedObject1id > 0 then 1 else case when ReferencedObject2id > 0 then 2 else ... end)

ConcreteEntity1Map()
{
    DiscriminatorValue(1);
}
于 2012-01-16T16:02:21.550 に答える