2012-11-19 68 views
2

我仍然在學習曲線,我卡住了。我用流利的nhibernate和automapping。我有一些約定配置哪些工作(別人做了)。流利nhibernate,繼承和使用派生列表類型

我有以下結構:

LoyaltyProgram 
UniversalProgram : LoyaltyProgram 
OtherProgram : LoyaltyProgram 

他們利用每一個分層其中工程表,所以一般約定是OK。 我創造了一些規則,用於存儲客戶幾點:

BasePointsRule 
AmountPointsRule : BasePointsRule 
TresholdPointsRule : BasePointsRule 

基點包含財產

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上時,數據庫上有兩個表,forevals正確引用UniversalProgram的鍵,這就像一個魅力。

問:是否有可能以某種方式覆蓋automappings ...我不知道...設置兩個約束(對於量和閾值)或一個爲其基類?

回答

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'"); 
    } 
} 
+0

我LINQ的嘗試'OfType <>()',這將是足夠的,甚至更好不錯的,但我發現問題集,或者我做了一些不好的假設(或誤解概念) - 因爲'BasePointsRule'可以包含這兩種類型,'AmountPointsRule'的'set'和'TPointPointsRule'應該調用'BasePointsRule'上的add - 在一些失敗後,我放棄並開始使用兩個強類型集合。 – Pawel

+0

如果你有set(ISet <>)的問題,也許你的equals和gethashcode實現是錯誤的 – Firo