我还在学习曲线上,我卡住了。我正在使用带有自动映射的流利的 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)或为其基类设置一个?