2

私はまだ学習曲線上にあり、立ち往生しています。自動マッピングで流暢な nhibernate を使用しています。機能するいくつかの規則を構成しています(他の誰かがそれを行いました)。

私は次の構造を持っています:

LoyaltyProgram
UniversalProgram : LoyaltyProgram
OtherProgram : LoyaltyProgram

彼らは機能する階層ごとのテーブルを使用しているため、一般的な規則は問題ありません。顧客ポイントを保存するためのいくつかのルールを作成しました。

BasePointsRule
AmountPointsRule : BasePointsRule
TresholdPointsRule : BasePointsRule

BasePoints にはプロパティが含まれています

public virtual UniversalProgram UniversalProgram { get; set; }

クラス UniversalProgram で、次のことを試みました。

public virtual ICollection<AmountPointsRule> AmountPointsRules { get; set; }
public virtual ICollection<TresholdPointsRule> TresholdPointsRules { get; set; }

両方を取得して設定できるようにしたいと考えています。

識別器を設定しました。

class BasePointsRuleMap : IAutoMappingOverride<BasePointsRule>
{
    public void Override(AutoMapping<BasePointsRule> mapping)
    {
        mapping.DiscriminateSubClassesOnColumn("basepointstype");
    }
}

しかし、データベースを調べると、テーブル BasePointsRule に作成された次の外部キーがあります。

alter table `BasePointsRule` 
    add index (UniversalProgramId), 
    add constraint FK_UniversalProgram_TresholdPointsRule_TresholdPointsRules 
    foreign key (UniversalProgramId) 
    references `LoyaltyProgram` (Id)

両方のプロパティを正しいディスクリミネーターで保存しますが、フェッチ中に AmountPointsRules は BasePointsRule と TresholdPoinstRules の適切なバッグからすべてのレコードを取得しますが、AmountPoinstRules がすべてを取得したため、正しいと思われる不正なアクセスが叫ばれます。

BasePointsRuleにabstractを置くと、データベースに2つのテーブルがあり、外部キーがUniversalProgramを適切に参照しており、これは魅力のように機能します。

質問: どうにかして自動マッピングを上書きすることは可能ですか... わかりません... 2 つの制約 (Amount と Treshold に対して) またはその基本クラスに対して 1 つを設定しますか?

4

1 に答える 1

2

LINQを使用する代わりに、2つの強く型付けされたコレクションが本当に必要かどうかを検討してください.OfType<>()。その場合、フィルター条件を追加します

class BasePointsRuleMap : IAutoMappingOverride<UniversalProgram>
{
    public void Override(AutoMapping<UniversalProgram> mapping)
    {
        mapping.HasMany(x => x.AmountPointsRules).Where("basepointstype='AmountPointsRule'");
        mapping.HasMany(x => x.TresholdPointsRules).Where("basepointstype='TresholdPointsRule'");
    }
}
于 2012-11-28T14:38:16.243 に答える