2

NHibernate で TPC 継承を使用したいさまざまなソースからの支払いオブジェクトのセットがあります。これらすべてのオブジェクトのベースは支払い処理業者です (したがって、すべてが一貫した形式を持っています) が、データベースには基本クラスの表現はありません。挿入しようとすると例外がスローされるという事実を除いて、マッピングはうまくいったと思います-「<エンティティ名>の<ユニオンサブクラス>マッピングでID列キー生成を使用できません」

クラス:

public class BasePayment
{
    public virtual int Id { get; set; }
    public virtual PaymentSource Source { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual decimal Amount { get; set; }
}

public class SubPayment : BasePayment
{
}

マッピング:

public class BasePaymentMap : ClassMap<BasePayment>
{
    public BasePaymentMap()
    {
        UseUnionSubclassForInheritanceMapping();
        DiscriminateSubClassesOnColumn("Source");
        Id(m => m.Id);
        Map(m => m.Source);
        Map(m => m.Amount);
        Map(m => m.Date);
    }
}

public class SubPaymentMap : SubclassMap<SubPayment>
{
    public SubPaymentMap()
    {
        DiscriminatorValue(PaymentSource.SourceX);
        Abstract();
        Table("SourceXPayments");
    }
}

そして、それは私が持っている限りです。SaveOrUpdate で上記のエラーが発生し、Google 検索はこれまで役に立たなかった - この質問を見つけた: Cannot use identity column key generation with <union-subclass> ( TABLE_PER_CLASS )問題をカバーしているように見えるJava/Hibernateでは、しかし、 Fluent NHibernateのメソッドにはテーブルがないように見えるため@GeneratedValue(strategy = GenerationType.TABLE)、Fluent構文への変換に問題があります。GeneratedBy()カバー。

それをもう少し読んでみると、これは不可能かもしれないので、誰かがこれを確認したり、状況の回避策を提供したりできるなら、それは大歓迎です.

十分な詳細を提供していない場合は、何がより役立つか教えてください。

前もって感謝します

4

1 に答える 1

6
UseUnionSubclassForInheritanceMapping();
DiscriminateSubClassesOnColumn("Source");

は競合しており、FNH は 1 つを無視します。

UseUnionSubclassForInheritanceMapping各クラスにはすべての列を含む独自のテーブルがあり、そのテーブルはクラスを識別するために使用され、列は不要であることを意味します

DiscriminateSubClassesOnColumn継承階層の各クラスが同じテーブルに存在し、クラスを識別するために列が使用されることを意味します。

エラー メッセージはUseUnionSubclassForInheritanceMapping、id が 1 つのテーブルに対してのみ一意であるため、ID 生成を使用することが許可されていないことを意味しますが、NHibernate はすべてのサブクラスを、id が一意でなければならない 1 つのセットとして脅かします。

たとえばsession.Get<BaseClass>(5);、同じ ID を持つ複数のサブクラスが存在する可能性があるため、もはや確実に機能しません。

@GeneratedValue(strategy = GenerationType.TABLE)「アイデンティティ以外の別の戦略を使用する」と言うだけです。GeneratedBy.HiLow(); アイデンティティの良い代替手段になります。

于 2012-05-25T06:24:57.650 に答える