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 上时,数据库上有两个表,外键正确引用 UniversalProgram,这就像一个魅力。

问题:是否有可能以某种方式覆盖自动映射以...我不知道...设置两个约束(用于 Amount 和 Treshold)或为其基类设置一个?

4

1 回答 1

2

考虑是否真的需要两个强类型集合而不是使用 LINQ 的.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 回答