我仍然在學習曲線,我卡住了。我用流利的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 ...我不知道...設置兩個約束(對於量和閾值)或一個爲其基類?
我LINQ的嘗試'OfType <>()',這將是足夠的,甚至更好不錯的,但我發現問題集,或者我做了一些不好的假設(或誤解概念) - 因爲'BasePointsRule'可以包含這兩種類型,'AmountPointsRule'的'set'和'TPointPointsRule'應該調用'BasePointsRule'上的add - 在一些失敗後,我放棄並開始使用兩個強類型集合。 – Pawel
如果你有set(ISet <>)的問題,也許你的equals和gethashcode實現是錯誤的 – Firo